Come posso specificare i file .gem locali nel mio Gemfile?


Risposte:


281

Questa non è una risposta rigorosa alla tua domanda sull'installazione dei .gempacchetti, ma puoi specificare tutti i tipi di ubicazioni su base gemma per gemma modificando il tuo Gemfile .

La specifica di un :pathattributo installerà la gemma da quel percorso sul tuo computer locale.

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

In alternativa, specificando un :gitattributo verrà installata la gemma da un repository git remoto.

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"

(Come menzionato da @JHurrah nel suo commento .)


Anche per alcuni firewall il protocollo git potrebbe essere un problema. In tal caso, provagem "foreman", :git => "https://github.com/pje/foreman.git"
kode

61

Sembra che il bundler non possa usare i file .gem immediatamente. Puntare il percorso: verso una directory contenente file .gem non funziona. Alcune persone hanno suggerito di installare un server gem locale (geminabox, stickler) a tale scopo.

Tuttavia, quello che ho trovato molto più semplice è usare un "server" gem locale dal file system: basta inserire i file .gem in una directory locale, quindi utilizzare "gem generate_index" per renderlo un repository Gem

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

Infine punta il bundler in questa posizione aggiungendo la seguente riga al tuo Gemfile

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

Se aggiorni le gemme nel repository, assicurati di rigenerare l'indice.


6
Grazie! Inoltre, avevo bisogno di una terza barra per fare "file: /// Absolute / Path / to / repo"
Anna,

5
Non sarebbe solo più semplice eseguire "gem server" dalla riga di comando e aggiungere l'origine " localhost: 8808 " al tuo Gemfile
Anna,

Questo è davvero fantastico Martin! Grazie per la condivisione, è esattamente quello che stavo cercando dal momento che non volevo dipendere dalla gestione gem serverné volevo ospitare l'intero progetto, solo il file .gem.
Leo Gallucci,

6
Suggerimento bonus: puoi aggirare il requisito del percorso assoluto utilizzando File.expand_path in questo modosource "file://#{File.expand_path('.')}/chef-11.10.0.dev.2"
Leo Gallucci

Non funziona per me. Mac OS X. Bundler v1.11.2:Could not fetch specs from file://Users/nakilon/....../
Nakilon,

44

Disimballerei la tua gemma nella cartella del fornitore dell'applicazione

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

Quindi aggiungi il percorso sul Gemfile per collegare la gemma non compressa.

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

29

Per impostazione predefinita, Bundler controlla prima il tuo sistema e se non riesce a trovare una gemma utilizzerà le fonti specificate nel tuo Gemfile.


Vero. ma cosa succede se non l'ho installato prima? (durante l'implementazione su un server) Impossibile trovare Imlib2-Ruby-0.5.2 in nessuno dei comandi di sorgenti terminati
ddayan,

184
puoi puntare a una directory locale con gem "gemname",: path => "~ / some / local / path"
JHurrah

5
Penso che: path richieda la cartella gem con il file gemspec. Ho solo file .gem che desidero installare.
ddayan,

1
Ok, quindi il cap deploy è passato, ma la gemma non è stata installata "Nessun file da caricare - vips": /
ddayan

4
Questo non è assolutamente vero, almeno non più. Bundler non guarda le gemme del tuo sistema e passa solo da ciò che è nel Gemfile. Uno dei motivi è così terribile.
bioneuralnet,

6

Puoi forzare il bundler a usare le gemme che dispieghi usando "bundle package" e "bundle install --local"

Sulla tua macchina di sviluppo:

bundle install

(Installa le gemme richieste e crea Gemfile.lock)

bundle package

(Memorizza nella cache le gemme nel fornitore / cache)

Sul server:

bundle install --local

(--local significa "usa le gemme dal fornitore / cache")


Cosa succede se non riesco a installare nulla sul server? In questo caso, ho bisogno di compilare con rake ma il server non ha una gemma che uso per costruire; ma non ho problemi a controllare le dipendenze.
Henrik

"bundle install" non ha funzionato per me se la gemma non era inclusa nel mio sorgente Gemfile esistente.
Anna,

Basta rimuovere temporaneamente il file gem dal modulo gem prima di farlo. bundle installSuccessivamente, copia il file gemma nel fornitore / cache , aggiungi la gemma al file gemma ed esegui bundle install --local
bert bruynooghe

1
bundle packageè un grande suggerimento, anche adesso, tre anni dopo. Se la tua versione di Bundler è precedente alla 2.0 (non ancora pubblicata in questo documento), dovrai utilizzarla bundle package --allse desideri includere gemme patho gitdipendenze. Tuttavia, ti darà un utile promemoria se rileva tali dipendenze.
L2G,

1
Cordiali saluti: questo potrebbe non funzionare bene come sperereste se sviluppaste su una piattaforma diversa da quella su cui vi distribuite (ad esempio sviluppate su macOS, distribuite su Linux). Secondo i --localdocumenti: "Nota che se su rubygems.org esiste una gemma specifica per la piattaforma appropriata, questa non verrà trovata."
Liam Dawson,

1

L'aggiunta .gema vendor/cachesembra funzionare. Nessuna opzione richiesta in Gemfile.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.