2009-06-25 27 views
11

Một số librararies Ruby Tôi đang sử dụng sử dụng require tuyên bố như thế này:"yêu cầu File.dirname (__ FILE__)" - làm thế nào để an toàn hoàn tác phụ thuộc hệ thống tập tin?

require File.dirname(__FILE__) + '/specification_helper.rb' 

lib_dir = File.expand_path(File.join(File.dirname(__FILE__), "lib")) 

require File.join(File.dirname(__FILE__), 'lib/tools', 'version') 

require File.expand_path(File.join(File.dirname(__FILE__), 'datautils', 'conn')) 

Không định dạng này làm cho mã của bạn không cần thiết phụ thuộc vào cấu trúc của hệ thống tập tin?

Tại sao tác giả làm theo cách này?

Có thể (an toàn) thay đổi mã này để loại bỏ sự phụ thuộc này trên hệ thống tệp không?

+0

xem thêm codemeta.source_pdir http://en.wikibooks.org/wiki/AnyLang_Programming_Language_Comparison/Anylang_Common_Concepts – dreftymac

Trả lời

10

Tôi thực sự sử dụng lược đồ này trong mã sản xuất.

file Yêu cầu liên quan đến vị trí nguồn hiện tại có một số ưu điểm:

  • cây nguồn có thể được di chuyển xung quanh như một toàn thể và vẫn có thể sử dụng kể từ khi chúng tôi yêu cầu các nguồn tương đối với nhau.
  • kể từ khi chúng tôi sử dụng đường dẫn đầy đủ, chúng tôi tránh va chạm tình cờ (tải một nguồn có cùng tên trong thư viện khác, hoặc tải lại cùng một nguồn hai lần)
  • mã có thể được sử dụng mà không cần phải thay đổi đường dẫn tìm kiếm ruby ​​của

bạn nên thích sử dụng một đường dẫn tìm kiếm ruby ​​sửa đổi, bạn có thể làm điều đó theo nhiều cách:

  1. thêm tùy chọn -I trên dòng lệnh ruby ​​
  2. sửa đổi biến $ LOAD_PATH trong nguồn
  3. chơi với các biến môi trường RUBYLIB

Giải pháp 1 ngụ ý việc kiểm soát như thế nào ruby ​​được gọi. Bạn sẽ cần một kịch bản để bắt đầu chương trình, chẳng hạn như:

@echo off 
REM my_script.cmd 
set srcdir=%~dp0\..\path\to\source 
ruby -I %srcdir% %srcdir%\my_script.rb 

Hoặc:

#!/bin/sh 
srcdir=$(cd $(dirname $0)/../path/to/source && pwd) 
exec ruby -I $srcdir $srcdir/my_script.rb 

Giải pháp 2 là hoàn toàn khả thi nhưng không tránh va chạm. Thông thường, bạn sẽ làm điều gì đó như:

$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) 

Giải pháp 3 là không thể chấp nhận được, bạn sẽ càng ít phụ thuộc vào biến môi trường.

Các vấn đề liên quan