Perubahan terbaru ke Ruby 1.9.2 tidak lagi menjadikan direktori saat ini menjadi .
bagian dari Anda LOAD_PATH
. Saya memiliki sejumlah non-sepele dari Rakefiles yang menganggap itu .
adalah bagian dari LOAD_PATH
, jadi ini mematahkan mereka (mereka melaporkan "tidak ada file seperti itu untuk memuat" untuk semua memerlukan pernyataan yang didasarkan dari jalur proyek). Apakah ada pembenaran khusus untuk melakukan ini?
Adapun perbaikan, menambahkan di $: << "."
mana-mana berfungsi, tetapi tampaknya sangat aneh dan saya tidak ingin melakukan itu. Apa cara yang disukai untuk membuat Rakefiles 1.9.2+ saya kompatibel?
require_relative
. Terima kasih.require './filename'
hanya berfungsi jika skrip Anda dieksekusi dengan direktori kerja diatur ke direktori yang sama dengan skrip tersebut. Ini sering tidak terjadi pada proyek multi-direktori.Ada dua alasan:
Keduanya didasarkan pada prinsip dasar yang sama: secara umum, Anda tidak bisa tahu apa direktori saat ini, ketika kode Anda dijalankan. Yang berarti bahwa, ketika Anda memerlukan file dan bergantung padanya di direktori saat ini, Anda tidak memiliki cara untuk mengontrol apakah file itu akan ada di sana, atau apakah itu file yang sebenarnya Anda harapkan ada di sana.
sumber
.
, yaitu direktori kerja saat ini. Jika penggunacd
masuk ke direktori yang berbeda, direktori kerja saat ini berubah, dan Anda sekarang memiliki file yang samarequire
sekali berbeda, tergantung pada direktori tempat pengguna tersebut berada ketika ia memanggil skrip Anda. Saya pikir itu bukan ide yang bagus.$: << File.dirname(__FILE__)
lib
direktori tersebut ada di$LOAD_PATH
dan kemudianrequire
semua file relatif terhadaplib
. Dengan kata lain: Saya serahkan kepada administrator untuk mencari tahu cara mengatur dengan$LOAD_PATH
benar. Jika Anda menggunakan RubyGems, itu sepele, karena RubyGems secara otomatis melakukannya untuk Anda, dan jika Anda menggunakan paket Debian, maka itu adalah tugas pengelola paket. Semua dalam semua, tampaknya berhasil dengan cukup baik..
dari$LOAD_PATH
, Ruby 1.9.2 memperkenalkanrequire_relative
... kejutan ...require
sa file yang relatif terhadap lokasi file yang sedang dijalankan (yaitu relatif terhadapFile.dirname(__FILE__)
).Seperti yang dijawab oleh orang lain, ini merupakan risiko keamanan karena
.
di jalur muat Anda merujuk ke direktori kerja saat iniDir.pwd
, bukan direktori file saat ini sedang dimuat. Jadi siapa pun yang menjalankan skrip Anda dapat mengubah ini hanya dengan masukcd
ke direktori lain. Tidak baik!Saya telah menggunakan jalur lengkap yang dibangun dari
__FILE__
sebagai alternatif.Tidak seperti
require_relative
ini, ini kompatibel dengan Ruby 1.8.7.sumber
require Pathname.new(__FILE__).dirname + 'filename'
Menggunakan
require_relative 'file_to_require'
Lemparkan ini ke dalam kode Anda untuk membuat pekerjaan require_relative di 1.8.7:
sumber
'.' di jalur Anda telah lama dianggap sebagai hal buruk di dunia Unix (lihat, misalnya, http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.html ). Saya berasumsi bahwa orang-orang Ruby telah diyakinkan oleh kebijaksanaan untuk tidak melakukan itu.
sumber
Saya menemukan ini sebagai perubahan yang membingungkan sampai saya menyadari beberapa hal.
Anda dapat mengatur RUBYLIB di profil Anda (Unix) dan melanjutkan hidup seperti yang Anda lakukan sebelumnya:
export RUBYLIB="."
Tapi seperti yang disebutkan di atas, sudah lama dianggap tidak aman untuk melakukannya.
Untuk sebagian besar kasus, Anda dapat menghindari masalah dengan hanya memanggil skrip Ruby Anda dengan huruf '.' mis ./scripts/server.
sumber
Seperti yang ditunjukkan Jorg W Mittag, saya pikir apa yang ingin Anda gunakan adalah
require_relative
agar file yang Anda perlukan relatif terhadap file sumberrequire
deklarasi dan bukan direktori kerja saat ini.Ketergantungan Anda harus relatif terhadap file rake build Anda.
sumber