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.