Come posso specificare una gemma locale nel mio Gemfile?


Risposte:


541

Credo che tu possa fare questo:

gem "foo", path: "/path/to/foo"

10
Un percorso codificato va bene per una sessione di hacking rapido, ma la soluzione gemma locale di bloudermilk è più efficace per i progetti sotto controllo della versione. Ti consente di continuare a controllare entrambi i progetti - gemma e progetto usando la gemma - in modo che gli altri non possano controllare la fonte gemma o condividere gli stessi percorsi.
mahemoff,

4
Puoi renderlo leggermente più pulito usando un link simbolico .gitignored alla tua gemma locale nella directory del progetto - in questo modo puoi usare il controllo del codice sorgente su entrambi i progetti separatamente e altri possono fare lo stesso senza avere una struttura di directory identica.
Dan,

7
Qualcosa a cui prestare attenzione potrebbe essere la primavera. Se stai usando un percorso locale per la tua gemma, potresti notare le versioni memorizzate nella cache della tua gemma locale, come ho fatto nella console di Rails. Se non sembra che le modifiche alle gemme locali vengano prese, prova spring stopa vedere se è davvero il problema.
Jason R,

1
L'aggiunta del percorso gemma locale a config / spring.rb sembra aiutare a raccogliere le modifiche gemma locale dopo il riavvio della console / server di rails.
Jason R,

5
Modo migliore per farlo qui: rossta.net/blog/…
Cyzanfar

230

Oltre a specificare il percorso (come menzionato da Jimmy), puoi anche forzare Bundler a utilizzare una gemma locale per il tuo ambiente solo usando la seguente opzione di configurazione:

$ bundle config local.GEM_NAME /path/to/local/git/repository

Questo è estremamente utile se stai sviluppando due gemme o una gemma e un'app di binari affiancate.

Nota però che funziona solo quando stai già usando git per la tua dipendenza, ad esempio:

# In Gemfile
gem 'rack', :github => 'rack/rack', :branch => 'master'

# In your terminal
$ bundle config local.rack ~/Work/git/rack

Come visto sui documenti .


Sto avendo problemi con questo perché sto usando BUNDLE_PATH(costruendo un pacchetto per la distribuzione). Quando fa quello che hai suggerito, o la risposta di Jimmy, fa solo un using, e non si installa nella mia BUNDLE_PATHcartella. Non sono riuscito a capirlo, qualche aiuto?
Automatico,

2
Nota che non funzionerà con un gemspec , per discussione qui .
davetapley,

31
Per disabilitare l'override locale:bundle config --delete local.GEM_NAME
alxndr

Ho dovuto rimuovere la direttiva versione dalla gem line per farlo funzionare.
Epigene,

4
Se desideri utilizzare un ramo diverso nello sviluppo dalla produzione, devi anche impostare bundle config disable_local_branch_check trueo Bundler si lamenterà del ramo. Fai attenzione, tuttavia, poiché i controlli dovrebbero impedire l'ingresso errato di commit Gemfile.lock. Documenti qui: bundler.io/v1.12/git.html
Leo

33

Puoi anche fare riferimento a una gemma locale con git se ti capita di lavorarci sopra.

gem 'foo',
  :git => '/Path/to/local/git/repo',
  :branch => 'my-feature-branch'

Quindi, se cambia, corro

bundle exec gem uninstall foo
bundle update foo

Ma non sono sicuro che tutti debbano eseguire questi due passaggi.


5
questo è fantastico, ma non è conveniente se stai sviluppando attivamente la gemma ... perché dovrai impegnare ogni cambiamento e bundle uninstall <gem> && bundle install , per ogni cambiamento che desideri riflesso sulla tua app
Ramses,

18

Per utilizzare il repository gem locale in un progetto Rails, attenersi alla seguente procedura:

  1. Controlla se la tua cartella gem è un repository git (il comando viene eseguito nella cartella gem)

    git rev-parse --is-inside-work-tree
  2. Ottenere il percorso del repository (il comando viene eseguito nella cartella gem)

    git rev-parse --show-toplevel
  3. Impostazione di una sostituzione locale per l'applicazione rotaie

    bundle config local.GEM_NAME /path/to/local/git/repository

    dov'è GEM_NAMEil nome della tua gemma ed /path/to/local/git/repositoryè l'output del comando nel punto2

  4. Nella tua applicazione Gemfileaggiungi la seguente riga:

    gem 'GEM_NAME', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'
  5. La corsa bundle installdovrebbe dare qualcosa del genere:

    Using GEM_NAME (0.0.1) from git://github.com/GEM_NAME/GEM_NAME.git (at /path/to/local/git/repository) 

    dov'è GEM_NAMEil nome della tua gemma e /path/to/local/git/repositorydal punto2

  6. Infine, corri bundle list, non gem liste dovresti vedere qualcosa del genere:

    GEM_NAME (0.0.1 5a68b88)

    dov'è GEM_NAMEil nome della tua gemma


Alcuni casi importanti che sto osservando usando:

Rails 4.0.2  
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux] 
Ubuntu 13.10  
RubyMine 6.0.3
  • Sembra che RubyMinenon mostri gemme locali come una biblioteca esterna. Ulteriori informazioni sul bug sono disponibili qui e qui
  • Quando cambio qualcosa nella gemma locale, per essere caricato nell'applicazione rails dovrei stop/startil server rails
  • Se sto cambiando la versiongemma, stopping/startingil server Rails mi dà un errore. Per risolverlo, sto specificando la versione gem nell'applicazione rails in Gemfilequesto modo:

    gem 'GEM_NAME', '0.0.2', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'

0

Puoi fare riferimento a gemme con l'origine: source: 'https://source.com', git repository (:github => 'git/url')e con il percorso locale :path => '.../path/gem_name'.
Puoi saperne di più sui Gemfile e su come usarli in questo articolo.


-4

Se vuoi anche il ramo:

gem 'foo', path: "point/to/your/path", branch: "branch-name"

Questo non funziona, genera un errore: Only gems with a git source can specify a branch.
KenB
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.