Bagaimana cara menentukan file .gem lokal di Gemfile saya?

158

Saya memiliki beberapa file permata yang saya instal melalui gem install xx.gem. Bisakah saya memberi tahu Bundler untuk menggunakannya? Atau apakah saya harus menentukan jalur sumber?

ddayan
sumber
Terkait: stackoverflow.com/questions/4487948/…
Ciro Santilli 郝海东 冠状 病 六四 六四 事件 法轮功

Jawaban:

281

Ini bukan semata-mata jawaban untuk pertanyaan Anda tentang menginstal .gempaket, tetapi Anda dapat menentukan semua jenis lokasi berdasarkan permata-demi-permata dengan mengedit Gemfile Anda .

Menentukan :pathatribut akan memasang permata dari jalur itu di mesin lokal Anda.

gem "foreman", path: "/Users/pje/my_foreman_fork"

Sebagai alternatif, menentukan :gitatribut akan menginstal permata dari repositori git jarak jauh.

gem "foreman", git: "git://github.com/pje/foreman.git"

# ...or at a specific SHA-1 ref
gem "foreman", git: "git://github.com/pje/foreman.git", ref: "bf648a070c"

# ...or branch
gem "foreman", git: "git://github.com/pje/foreman.git", branch: "jruby"

# ...or tag
gem "foreman", git: "git://github.com/pje/foreman.git", tag: "v0.45.0"

(Seperti @JHurrah disebutkan dalam komentarnya .)

Pje
sumber
Juga untuk beberapa firewall, protokol git mungkin menjadi masalah. Jika demikian, cobagem "foreman", :git => "https://github.com/pje/foreman.git"
kode
61

Tampaknya bundler tidak dapat menggunakan file .gem di luar kotak. Menunjuk jalur: ke direktori yang berisi file .gem tidak berfungsi. Beberapa orang menyarankan untuk menyiapkan server permata lokal (geminabox, stickler) untuk tujuan itu.

Namun, yang saya temukan jauh lebih sederhana adalah dengan menggunakan permata "server" lokal dari sistem file: Cukup masukkan file .gem Anda di direktori lokal, lalu gunakan "gem generate_index" untuk menjadikannya repositori Gem

mkdir repo
mkdir repo/gems
cp *.gem repo/gems
cd repo
gem generate_index

Akhirnya arahkan bundler ke lokasi ini dengan menambahkan baris berikut ke Gemfile Anda

source "file://path/to/repo"

Jika Anda memperbarui permata di repositori, pastikan untuk membuat ulang indeks.

Martin Thiede
sumber
6
Terima kasih! Juga, saya membutuhkan tebasan ketiga untuk melakukan "file: /// Absolute / Path / to / repo"
Anna
5
Bukankah lebih mudah untuk menjalankan "server permata" pada baris perintah dan menambahkan sumber " localhost: 8808 " ke Gemfile Anda
Anna
Ini benar-benar keren, Martin! Terima kasih telah berbagi, persis seperti yang saya cari karena saya tidak ingin bergantung pada menjalankan gem serveratau saya ingin meng-host seluruh proyek, hanya file .gem.
Leo Gallucci
6
Kiat bonus: Anda dapat memenuhi persyaratan jalur absolut dengan menggunakan File.expand_path seperti inisource "file://#{File.expand_path('.')}/chef-11.10.0.dev.2"
Leo Gallucci
Tidak bekerja untuk saya. Mac OS X. Bundler v1.11.2:Could not fetch specs from file://Users/nakilon/....../
Nakilon
44

Saya akan membongkar permata Anda di folder vendor aplikasi

gem unpack your.gem --target /path_to_app/vendor/gems/

Kemudian tambahkan path pada Gemfile untuk menghubungkan permata yang belum dibongkar.

gem 'your', '2.0.1', :path => 'vendor/gems/your'
edap
sumber
29

Secara default Bundler akan memeriksa sistem Anda terlebih dahulu dan jika tidak dapat menemukan permata, ia akan menggunakan sumber yang ditentukan dalam Gemfile Anda.

JHurrah
sumber
Benar. tetapi bagaimana jika saya belum menginstalnya sebelumnya (ketika saya menggunakan ke server) Tidak dapat menemukan Imlib2-Ruby-0.5.2 di salah satu sumber perintah selesai
ddayan
184
Anda dapat menunjuk ke direktori lokal dengan gem "gemname",: path => "~ / some / local / path"
JHurrah
5
Saya berpikir bahwa: path memerlukan folder gem dengan file gemspec. Saya hanya punya file .gem yang ingin saya instal.
ddayan
1
Ok jadi cap deploy sudah lewat, tetapi permata itu tidak diinstal "Tidak ada file seperti itu untuk memuat - vips": /
ddayan
4
Itu jelas tidak benar, setidaknya lebih lama. Bundler tidak melihat permata sistem Anda, dan hanya berjalan dengan apa yang ada di Gemfile. Salah satu alasannya sangat mengerikan.
bioneuralnet
6

Anda dapat memaksa bundler untuk menggunakan permata yang Anda gunakan menggunakan "paket bundel" dan "bundel instal --local"

Di mesin pengembangan Anda:

bundle install

(Menginstal permata yang diperlukan dan membuat Gemfile.lock)

bundle package

(Tembolok permata di vendor / cache)

Di server:

bundle install --local

(--local berarti "gunakan permata dari vendor / cache")

Henry Collingridge
sumber
Bagaimana jika saya tidak dapat menginstal apa pun di server? Dalam hal ini, saya perlu membangun dengan menyapu tetapi server tidak memiliki permata yang saya gunakan untuk membangun; tapi saya tidak punya masalah memeriksa dependensi.
Henrik
"bundle install" tidak berfungsi untuk saya jika permata itu tidak termasuk dalam sumber Gemfile yang ada "
Anna
Hapus saja file permata untuk sementara dari file permata sebelum melakukannya. bundle installSetelah itu, salin file permata ke vendor / cache , tambahkan file permata kembali ke file permata dan jalankan bundle install --local
bert bruynooghe
1
bundle packageadalah saran yang bagus, bahkan sekarang, tiga tahun kemudian. Jika versi Bundler Anda lebih lama dari 2.0 (belum dirilis pada penulisan ini), Anda perlu menggunakan bundle package --alljika Anda ingin menyertakan permata dengan pathatau gitdependensi. Ini akan memberi Anda pengingat yang membantu jika mendeteksi dependensi seperti itu.
L2G
1
FYI: ini mungkin tidak berfungsi sebaik yang Anda harapkan jika Anda mengembangkan pada platform yang berbeda dari yang Anda sebarkan (misalnya berkembang di macOS, sebarkan ke Linux). Sesuai --localdokumen: "Perhatikan bahwa jika permata khusus platform yang sesuai ada di rubygems.org, itu tidak akan ditemukan."
Liam Dawson
1

Menambahkan .gemke vendor/cachetampaknya bekerja. Tidak ada opsi yang diperlukan di Gemfile.

Victor Moroz
sumber