ruby on rails what Come posso bloccare le gemme in un'applicazione Rails 3?




software ruby on rails (11)

Non ho ancora dovuto farlo, ma credo che sia tutto gestito da bundler .

Quando crei una nuova app per rails3, le dipendenze di rails vengono inserite nel tuo Gemfile . È possibile eseguire l' bundle install per installarli. Per impostazione predefinita, sono installati nel tuo BUNDLE_PATH .

Se vuoi installarli nella tua app, puoi specificare dove: bundle install vendor/gems .

Voglio bloccare un gioiello specifico nella mia applicazione Rails.

In rails 2 c'era questo comando:

rake gems:unpack

Non riesco a trovare quel comando in Rails 3.


Quindi, la risposta breve è, non lo fai.

Quando modifichi il tuo Gemfile e poi esegui l' bundle install o l' bundle update , bundler gestisce la risoluzione delle dipendenze per te e determina le migliori (più recenti) versioni di ciascuna gemma richiesta che soddisfi l'intera catena di dipendenze (non otterrai un nuova versione che rompe un altro gioiello nell'elenco delle dipendenze, ecc.). Ovviamente puoi anche posizionare una versione specifica, o una specifica '> = 1.2.3' o qualcosa del genere nel Gemfile usando la sintassi familiare dei giorni di config.gem , e bundler si accerterà di soddisfarlo (o vinci ') t produrre un Gemfile.lock se non c'è una risoluzione valida).

Quando Bundler fa il suo business, crea il file Gemfile.lock, che (e questo viene fornito con il solo bundler per la gestione della gemma su tutte le workstation / ambienti / distribuzioni) svolge la stessa funzione di congelare tutte le gemme che hai richiesto . Gratuito! (Controlla questo file nel controllo di versione!) Se il tuo nuovo interno di sviluppo abbassa la fonte su una macchina nuova, richiede una bundle install e le stesse identiche versioni delle gemme che hai installato sono sulla sua macchina. Spingi alla distribuzione, e bundle install --deployment un bundle install --deployment lì (o più probabilmente, buttalo nel tuo Capfile), e le stesse gemme sono installate (questa volta in vendor / bundle, configurabili). Bundle è usato in Rails 3 per gestire il caricamento di tutte le gemme, quindi ovunque tu abbia detto a bundler di installarle (qualunque sia il normale percorso di gem install è di default, o BUNDLE_PATH (che è registrato in .bundle / config se si installa con bundle install --path=foo altrimenti), bundler caricherà quelli giusti, anche quando si differenziano dalle gemme di sistema.

Non è necessario decomprimere le gemme e collegarle alla tua app, perché non importa: stai garantendo che le stesse versioni vengano chiamate indipendentemente da dove sono installate, il che probabilmente varierà da macchina a macchina comunque (.bundle / non dovrebbe essere archiviato nel repository) - quindi perché inserire altri 60-80 MB di file nel repository che non cambierete o non userete mai? (per inciso, questo è il motivo per cui non consiglierei l' bundle install --path=vendor/gems un bundle install --path=vendor/gems come suggerito da nfm - non è necessariamente sbagliato, non c'è alcun vantaggio nel normale flusso di lavoro del bundler, e ora le dimensioni del repository sono semplicemente aumentate ).


NON USARE LA RISPOSTA "RACCOMANDATA" DA NFM!

Invece, controlla il sito di Bundler, in particolare la pagina sulle distribuzioni: http://gembundler.com/deploying.html

Il breve sommario è di utilizzare versioni specifiche nel tuo Gemfile ed eseguire l' bundle install --deployment su ogni sistema di destinazione in cui hai bisogno delle versioni gem esatta.

L' --path dell'opzione --path installerà le gemme, ma non è proprio quello che vuoi fare. Come ha detto Matt Enright, hai semplicemente gonfiato il tuo SCM con cose che il bundler può gestire in modo intelligente su ogni ambiente di destinazione.


Ho dovuto farlo per la distribuzione di typus gem su Heroku in quanto non è possibile eseguire un heroku rails generate typus su Heroku dato che si tratta di un file system di sola lettura. Non volevo che TUTTE le gemme fossero inserite nella mia app, solo quella che mi stava causando dolore. Ecco i passaggi che portano al successo:

  1. creare la directory in app_name / vendor / gems / gem_name (opzionale) ... nel mio caso / nome_app / vendor / gems / typus

  2. aggiungi quanto segue a gemfile (questo dice a bundle dove trovare e mettere l'origine gem):

    gem 'typus',: git => 'https://github.com/fesplugas/typus.git',: percorso => ​​"fornitore / gemme / typus"

  3. quindi dall'interno della directory dell'app (questo installa la gemma nella tua app):

    'gem unpack typus --target vendor / gems / typus'

  4. quindi bundle install

  5. poi ... nel mio caso ... commetti e spingo al repository e poi schieralo su heroku ... potresti dover eseguire un heroku rake db:migrate


Il comando che desideri è un bundle package che decomprime solo le gemme e le dipendenze nella cartella vendor/cache .

Ma solo un avviso, il :git => .... tipo di gemme non verrà confezionato. Devi incidere una via d'uscita per :git => ... gemme correlate per essere impacchettato.


I seconda la risposta di tsega (aggiornato da coreyward). "pacchetto pacchetto" è la risposta generica.

Il poster non chiedeva SE STESSA di congelare le sue gemme. Voleva sapere come. Risposte come "Basta non farlo" non sono affatto utili. Sì, si è scoperto che il suo problema specifico era un po 'diverso da quello, ma mentre "pacchetto pacchetto" avrebbe potuto essere eccessivo, risolve comunque il problema.

Ho lavorato su molti sistemi e su alcuni non hai accesso completo. Installare gemme su alcuni sistemi non è un'opzione. Quindi, a meno che non li impacchetta, in generale sei fregato. Esistono soluzioni alternative per host e sistemi diversi, ma nessuno per alcuni.


Molti commenti dicono che non è utile usare l'installazione di bundle --path vendor / gems, ma quelle persone che usano Dreamhost, dovrebbe notare che non è possibile utilizzare l'installazione di bundle in DreamHost.

La soluzione è quella di ottenere tutte le gemme nella cartella del venditore e caricare l'intero file nella directory Dreamhost.

Esistono altre soluzioni per aggirare questo problema, ma è molto più complicato da fare.


Istruzioni di pulizia per la gem unpack della gem unpack e :path => opzione:

  • https://.com/a/8913286/555187

Puoi bundle installare su dreamhost senza problemi. Se si è condivisi, l'ambiente è già configurato per memorizzarli localmente nella propria directory home. Se sei su un VPS o Dedicato puoi eseguire l'installazione di bundle come root o semplicemente aggiungerlo al tuo .bash_profile

export GEM_HOME=$HOME/.gems
export GEM_PATH=$GEM_HOME:/usr/lib/ruby/gems/1.8

Bene, devo modificare leggermente una delle gemme che mi servono. Quindi ho bisogno di tenerlo dentro il mio Repo. Quindi quello che NFM ha menzionato è quello di cui ho probabilmente bisogno.


Pod - Se hai bisogno di modificare la gemma, la best practice per fare ciò sarebbe forking il progetto, apportando la modifica, quindi usando il flag 'git' in bundler:

git 'some_gem', :git => 'git://github.com/me/my_forked_some_gem.git'

In questo modo riceverai una notifica quando la gemma viene aggiornata.





bundler