Qual è il modo migliore per archiviare la configurazione specifica dell'app in rotaie?
-
02-07-2019 - |
Domanda
Devo archiviare la configurazione specifica dell'app in rotaie. Ma deve essere:
- raggiungibile in qualsiasi file (modello, vista, helper e controller
- ambiente specificato (o meno), ciò significa che ogni ambiente può sovrascrivere le configurazioni specificate in environment.rb
Ho provato a usare environment.rb e ho messo qualcosa come
USE_USER_APP = true
che ha funzionato per me ma quando si tenta di sovrascriverlo in un ambiente specifico non funzionerà perché production.rb, ad esempio, sembra essere all'interno del blocco Rails: Initializer.run.
Quindi, chiunque?
Soluzione
Stavo aiutando un amico a configurare la soluzione citata da Ricardo ieri. Lo abbiamo hackerato un po 'caricando il file YAML con qualcosa di simile a questo (andando dalla memoria qui):
require 'ostruct'
require 'yaml'
require 'erb'
#config = OpenStruct.new(YAML.load_file("#{RAILS_ROOT}/config/config.yml"))
config = OpenStruct.new(YAML.load(ERB.new(File.read("#{RAILS_ROOT}/config/config.yml")).result))
env_config = config.send(RAILS_ENV)
config.common.update(env_config) unless env_config.nil?
::AppConfig = OpenStruct.new(config.common)
Questo gli ha permesso di incorporare il codice Ruby nella configurazione, come in Rhtml:
development:
path_to_something: <%= RAILS_ROOT %>/config/something.yml
Altri suggerimenti
Guarda Configatron: http://github.com/markbates/configatron/tree/master
Devo ancora usarlo, ma lo sta attivamente sviluppando ora e sembra abbastanza carino.
La cosa più semplice da fare è impostare una variabile di classe dal tuo ambiente.rb. L'ho fatto per Google Analytics. In sostanza voglio una chiave diversa a seconda dell'ambiente in cui mi trovo, quindi lo sviluppo o la messa in scena non distorcono le metriche.
Ecco come l'ho fatto.
In lib / analytics / google_analytics.rb
:
module Analytics
class GoogleAnalytics
@@account_id = nil
cattr_accessor :account_id
end
end
E poi in environment.rb
o in environment / production.rb
o in uno qualsiasi degli altri file di ambiente:
Analytics::GoogleAnalytics.account_id = "xxxxxxxxx"
Quindi, ovunque tu debba fare riferimento, dì il layout predefinito con JavaScript di Google Analytics, ti basta chiamare Analytics :: GoogleAnalytics.account_id
.
Ho trovato un buon modo qui
Usa variabili d'ambiente. Heroku lo usa. Ricorda che se mantieni la configurazione nella base di codice, chiunque abbia accesso al codice ha accesso a qualsiasi configurazione segreta (chiavi api aws, chiavi api gateway, ecc.)
l'envdir di daemontool è un buon strumento per impostare la configurazione, sono abbastanza sicuro che è quello che Heroku usa per dare all'applicazione le sue variabili di ambiente.
Ho usato Impostazioni Rails memorizzate nella cache .
È molto semplice da usare, mantiene i valori di configurazione memorizzati nella cache e consente di modificarli dinamicamente.