2015-10-04 24 views
10

Il mio ultimo progetto Rails è più o meno e sperimenta per me per rompere molte cose e imparare nel processo. Ho l'ultima versione di Ruby specificato nella mia Gemfile:È una cattiva pratica elencare la versione di Ruby in Gemfile e Dotfile in versione .ruby?

ruby '2.2.3'

E ho anche una .ruby-version Dotfile nel progetto, con i seguenti contenuti:

2.2.3

Oltre l'ovvio duplicazione, cosa c'è di sbagliato in questo? Qual è lo scopo di entrambe le convenzioni? Se dovessi avere solo una convenzione per elencare la mia versione di Ruby, perché dovrei avere uno (Gemfile) sull'altro (dotfile)?

È perfettamente corretto avere entrambe le convenzioni in un progetto?

Ho intenzione di essere l'unico manutentore di questo progetto sperimentale, e non credo che sarà un problema dover mantenere questa duplicazione sottile. Non ho intenzione di aggiornare Ruby per questo progetto, e se lo faccio, non avrò problemi a ricordare di farlo in entrambi i posti. A parte questo dettaglio, evito certamente qualsiasi duplicazione di questo tipo nelle codebase delle mie applicazioni.

+0

Penso che non è necessario specificare la versione rubino nel vostro Gemfile a tutti . –

+3

Afaik '.ruby-version' imposta la versione Ruby per RVM o rbenv, ma Heroku ad esempio prende la versione Ruby dal Gemfile ([fonte] (https://devcenter.heroku.com/articles/ruby-versions)) . – spickermann

+0

Grazie a @spickermann, sembra che sia una buona idea avere entrambi. – Todd

risposta

12

Ciascuno di essi è stato sviluppato da diversi team in momenti diversi e viene utilizzato da software diversi.

L'elenco di una versione in rubino nel file Gemfile è feature in bundler.

Dato che Gemfile viene utilizzato principalmente da bundler, per lo più funziona solo con il bundler - utilizzando bundle exec o software (come Rails) che attiva automaticamente il bundler per te. Il suo effetto è semplicemente quello di commettere errori e rifiutarsi di eseguire se non si sta utilizzando la versione di ruby ​​specificata. È un requisito: corri sotto questo rubino, o ti lascio un errore che ti avverte che stai correndo sotto il rubino sbagliato.

Tuttavia, heroku also pays attention alla versione specificata nel Gemfile e verrà eseguito con quella versione. Heroku ha deciso di usare la funzione anche in bundler. Ma la maggior parte degli altri software, sulla tua workstation, o anche travis, non usa quella convenzione. (Travis ti permette di modificare il tuo .travis.yml ENV per specificare la versione ruby ​​da usare).

La caratteristica in Bundler è stato introdotto nel Bundler 1.2 nel mese di agosto 2012.

Il file .ruby-version è stato introdotto da rvm, la prima versione del direttore rubino. Se si utilizza rvm e si passa a una direcotry di progetto con un file .ruby-version, rvm passerà automaticamente alla shell utilizzando la versione ruby ​​specificata.

Non sono sicuro di quando rvm ha introdotto questa funzione, ma penso prima della funzione "ruby" di Gemfile.

Dal rvm introdusse, altra versione rubino software come rbenv e chruby commutazione hanno adottato troppo a fare la stessa cosa - passare alla versione ruby ​​specificato quando si cd nella directory automaticamente. Anche se penso con rbenv e chruby, potrebbe essere una caratteristica opzionale.

Quindi erano diverse funzionalità introdotte e supportate da diversi pacchetti software in momenti diversi, facendo cose un po 'diverse.

Sono d'accordo che sarebbe noioso mantenere entrambi e mantenerli sincronizzati.

Sono entrambi effettivamente opzionali, non è necessario utilizzare uno dei due. Tranne che potresti aver bisogno di usare le specifiche del rubino Gemfile per heroku, per dire quale rubino vuoi che funzioni.

Non uso personalmente neanche. Ma se hai bisogno di lavorare in diverse versioni di ruby ​​in diversi progetti e trovi conveniente avere il tuo gestore di versioni ruby ​​(rvm, rbenv o chruby) passa automaticamente alla versione ruby ​​specifica del progetto, .ruby-version potrebbe essere utile.

Tranne che per scopi heroku, l'elenco di ruby ​​nel file Gem è principalmente per evitare di commettere un errore, ad esempio per la distribuzione. O forse una distribuzione automatizzata interna o un ambiente CI potrebbe usarli in qualche modo come fa heroku, o forse altri stack di distribuzione cloud lo avranno o l'avranno adottato. Penso che molti l'abbiano trovato non troppo utile - anche questo, non lo userei fino a quando non incontrerai o vedrai un problema che sta risolvendo. Un inconveniente che alcune persone hanno con l'elencare le versioni in Ruby in Gemfile è che con i nuovi rubini che escono sempre, devi aggiornare continuamente tutti i tuoi Gemfile.

In generale, gli ultimi due anni di release di ruby ​​sono stati tutti molto compatibili con le versioni precedenti, limitando la necessità di essere sicuri di utilizzare una versione esatta di ruby, il codice più recente verrà eseguito sul rubino più recente, anche se è stato originariamente scritto per uno più vecchio.

Non credo che nessuna funzione ti permetta di specificare una gamma di versioni di rubini, come 2.2.* o cosa hai.

Con una o entrambe le funzioni, usale solo se ne hai bisogno o le trovi utili, non devi nemmeno usarle, ed è bello (se fastidioso) usare entrambe, se hai bisogno di entrambi.

Poiché un Gemfile è un codice rubino in tempo reale, è possibile che il proprio Gemfile legga il file .ruby-version e utilizzi automaticamente tale valore come valore Gemfile ruby. Se volevi usare entrambi e "non ripeterti" con esso. Non so se è una cosa comune da fare, ci ho pensato. Ma dovrebbe funzionare bene.

+0

Grazie per la risposta completa. – Todd

+0

Inoltre, ho una domanda potenzialmente correlata qui: http://stackoverflow.com/questions/34905560/is-it-a-bad-practice-to-have-both-a-rvmrc-and-a-ruby-version -in-un-un-progetto-rubino, dovrebbe preoccuparsi di fornire di nuovo tale saggezza :) – Todd

6

Penso che sia meglio evitare di elencare due volte la stessa informazione a meno che non ci sia una buona ragione - cioè, tenerlo asciutto.

È possibile memorizzare la versione rubino ".ruby-versione", e poi nel Gemfile fare qualcosa di simile:

ruby File.open('.ruby-version', 'rb') { |f| f.read.chomp } 
+2

Questo è così ASCIUTO che irrita. In ogni caso, dovrai modificare manualmente la versione in '.ruby-version', la sostituzione di più istanze è banale con il tuo editor preferito. – Dennis

+0

@Dennis è l'essenza di essere SECCHI. Qualcuno potrebbe dimenticare di fare una ricerca sostitutiva. Questo codice ti dice che voglio usare la stessa versione di .ruby-version – PhilT

+2

Questo è un po 'più succinto ed equivalente: ruby ​​File.read ('. Ruby-version ', modalità:' rb ').chomp – Empact