Saya telah melihat dua teknik yang umum digunakan untuk menambahkan direktori file yang saat ini sedang dijalankan ke $ LOAD_PATH (atau $ :). Saya melihat keuntungan melakukan ini jika Anda tidak bekerja dengan permata. Yang satu tampak lebih bertele-tele daripada yang lain, jelas, tetapi adakah alasan untuk memilih salah satu dari yang lain?
Pertama, metode verbose (bisa berlebihan):
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
dan yang lebih lugas, cepat-dan-kotor:
$:.unshift File.dirname(__FILE__)
Ada alasan untuk memilih salah satu dari yang lain?
File.expand_path(File.dirname(__FILE__)).tap {|pwd| $LOAD_PATH.unshift(pwd) unless $LOAD_PATH.include?(pwd)}
__dir__
(seperti pada Ruby 2.0) dapat membuat semua ini lebih ringkas.Jawaban:
Saya akan mengatakan pergi dengan
$:.unshift File.dirname(__FILE__)
yang lain, hanya karena saya telah melihat lebih banyak penggunaannya dalam kode daripada yang$LOAD_PATH
satu, dan itu juga lebih pendek!sumber
Jalur pemuatan Ruby sangat sering terlihat ditulis sebagai $:, tetapi hanya karena pendek, tidak membuatnya lebih baik. Jika Anda lebih suka kejelasan daripada kepintaran, atau jika singkatnya hanya membuat Anda gatal, Anda tidak perlu melakukannya hanya karena orang lain begitu. Menyapa ...
... dan ucapkan selamat tinggal pada ...
sumber
Saya tidak terlalu menyukai cara 'cepat-dan-kotor'. Siapa pun yang baru mengenal Ruby akan memikirkan apa
$:.
itu Ruby .Saya menemukan ini lebih jelas.
Atau jika saya peduli tentang memiliki jalan yang lengkap ...
UPDATE 2009/09/10
Akhir-akhir ini saya telah melakukan yang berikut:
Saya telah melihatnya di sejumlah besar proyek ruby yang berbeda saat menjelajahi GitHub.
Sepertinya konvensi?
sumber
bin
file yang selalu relatif dengan Andacode
dan itu hanya pernah dijalankan olehbin
file ... bootstrap di tempat sampah. Jika Anda memiliki perpustakaan, kemudian bootstrap di bagian atas kode perpustakaan Anda seperti dilib/code.rb
untuk mendapatkan akses ke semua yang ada di bawahlib/code/
. Semoga ocehan ini membantu!__dir__
bisa digunakan untuk mendapatkan jalur ke direktori file saat ini.Jika Anda mengetik
script/console
di proyek Rails Anda dan masuk$:
, Anda akan mendapatkan sebuah array yang menyertakan semua direktori yang diperlukan untuk memuat Ruby. Hal yang dapat diambil dari latihan kecil ini$:
adalah sebuah array. Dengan demikian, Anda dapat menjalankan fungsi di dalamnya seperti menambahkan direktori lain denganunshift
metode atau<<
operator. Seperti yang Anda tersirat dalam pernyataan Anda$:
dan$LOAD_PATH
adalah sama.Kerugian melakukannya dengan cara cepat dan kotor seperti yang Anda sebutkan adalah: jika Anda sudah memiliki direktori di jalur boot Anda, itu akan terulang kembali.
Contoh:
Saya memiliki plugin yang saya buat bernama todo. Direktori saya terstruktur seperti ini:
Di file init.rb saya memasukkan kode berikut:
Perhatikan bagaimana saya memberi tahu blok kode untuk melakukan tindakan di dalam blok ke string 'model', 'pengontrol', dan 'model', di mana saya mengulangi 'model'. (FYI,
%w{ ... }
hanyalah cara lain untuk memberi tahu Ruby untuk menyimpan array string). Ketika saya menjalankanscript/console
, saya mengetik yang berikut ini:Dan saya mengetik ini agar lebih mudah membaca konten dalam string. Output yang saya dapatkan adalah:
Seperti yang Anda lihat, meskipun ini adalah contoh sederhana yang dapat saya buat saat menggunakan proyek yang sedang saya kerjakan, jika Anda tidak berhati-hati, cara cepat dan kotor akan mengarah ke jalur yang berulang. Cara yang lebih panjang akan memeriksa jalur yang berulang dan memastikan jalur tersebut tidak terjadi.
Jika Anda seorang programmer Rails yang berpengalaman, Anda mungkin memiliki gagasan yang sangat baik tentang apa yang Anda lakukan dan kemungkinan besar tidak membuat kesalahan dengan mengulangi jalur. Jika Anda seorang pemula, saya akan melanjutkan dengan cara yang lebih panjang sampai Anda benar-benar memahami apa yang Anda lakukan.
sumber
load_paths
danload_once_paths.delete
sudah tidak digunakan lagi. Akan terbantu untuk memperbarui baris yang merujuk pada mereka seperti:ActiveSupport::Dependencies.autoload_paths << path
ActiveSupport::Dependencies.autoload_once_paths.delete(path)
Terbaik yang saya temui untuk menambahkan dir melalui jalur relatif saat menggunakan Rspec. Saya merasa cukup bertele-tele tetapi juga masih satu liner yang bagus.
sumber
Ada permata yang memungkinkan Anda mengatur jalur pemuatan Anda dengan kode yang lebih bagus dan lebih bersih. Lihat ini: https://github.com/nayyara-samuel/load-path .
Ini juga memiliki dokumentasi yang bagus
sumber
Saya tahu sudah lama sejak pertanyaan ini pertama kali diajukan, tetapi saya memiliki jawaban tambahan yang ingin saya bagikan.
Saya memiliki beberapa aplikasi Ruby yang dikembangkan oleh programmer lain selama beberapa tahun, dan mereka menggunakan kembali kelas yang sama di aplikasi yang berbeda meskipun mereka mungkin mengakses database yang sama. Karena ini melanggar aturan KERING, saya memutuskan untuk membuat perpustakaan kelas untuk digunakan bersama oleh semua aplikasi Ruby. Saya bisa saja meletakkannya di pustaka Ruby utama, tetapi itu akan menyembunyikan kode khusus dalam basis kode umum yang tidak ingin saya lakukan.
Saya mengalami masalah ketika saya mengalami konflik nama antara nama "profile.rb" yang sudah ditentukan, dan kelas yang saya gunakan. Konflik ini bukanlah masalah sampai saya mencoba membuat pustaka kode umum. Biasanya, Ruby mencari lokasi aplikasi terlebih dahulu, lalu pergi ke lokasi $ LOAD_PATH.
Application_controller.rb tidak dapat menemukan kelas yang saya buat, dan memberikan kesalahan pada definisi asli karena ini bukan kelas. Karena saya menghapus definisi kelas dari bagian app / models pada aplikasi, Ruby tidak dapat menemukannya di sana dan mencarinya di jalur Ruby.
Jadi, saya memodifikasi variabel $ LOAD_PATH untuk memasukkan jalur ke direktori perpustakaan yang saya gunakan. Ini dapat dilakukan di file environment.rb pada saat inisialisasi.
Bahkan dengan direktori baru yang ditambahkan ke jalur pencarian, Ruby memberikan kesalahan karena Ruby lebih memilih mengambil file yang ditentukan sistem terlebih dahulu. Jalur pencarian dalam variabel $ LOAD_PATH secara istimewa mencari jalur Ruby terlebih dahulu.
Jadi, saya perlu mengubah urutan pencarian sehingga Ruby menemukan kelas tersebut di perpustakaan umum saya sebelum mencari di perpustakaan bawaan.
Kode ini melakukannya di file environment.rb:
Saya tidak berpikir Anda dapat menggunakan salah satu konstruksi pengkodean lanjutan yang diberikan sebelumnya pada tingkat ini, tetapi berfungsi dengan baik jika Anda ingin menyiapkan sesuatu pada waktu inisialisasi di aplikasi Anda. Anda harus mempertahankan urutan asli variabel $ LOAD_PATH asli ketika ditambahkan kembali ke variabel baru, jika tidak, beberapa kelas Ruby utama akan hilang.
Di file application_controller.rb, saya cukup menggunakan file
dan ini memuat file pustaka kustom untuk seluruh aplikasi, yaitu, saya tidak perlu menggunakan perintah require di setiap pengontrol.
Bagi saya, ini adalah solusi yang saya cari, dan saya pikir saya akan menambahkannya ke jawaban ini untuk menyampaikan informasi.
sumber