Variables d'environnement locales et Heroku
j'ai une application sinatra dans laquelle j'ai un fichier yml pour définir des variables d'environnement, je les appelle en utilisant cette méthode
module MyConfig
def config
environment = ENV["RACK_ENV"] || "development"
YAML.load_file("./config/config.yml")[environment]
end
end
donc quand je veux utiliser une variable je le fais par exemple
aws_access_key_id = config['aws_access_key']
j'en ai un .gitignore fichier qui ignore config.yml en poussant vers github par exemple.Donc quand je pousse vers heroku ces variables d'environnement ne seront pas accessibles?
donc cela me laisse avec l'utilisation de la façon heroku de les mettre comme donc
heroku config:add aws_access_key= myapikey
mais heroku y accède comme
aws_access_key_id = ENV['aws_access_key']
Comment puis-je configurer mon environnement dev pour utiliser la méthode config et heroku utiliser ENV, est-ce que je regarde cela de la mauvaise façon? ou est-ce que ma méthode de configuration fait ça pour moi?
Toute aide appréciée
RAKEFILE
require 'active_support/core_ext'
require './config/config.rb'
require 'bundler/setup'
Bundler.require(:default)
include MyConfig
AssetSync.configure do |con|
con.fog_provider = 'AWS'
con.fog_region = 'eu-west-1'
con.fog_directory = config['fog_directory']
con.aws_access_key_id = config['aws_access_key']
con.aws_secret_access_key = config['aws_secret_key']
con.prefix = "assets"
con.public_path = Pathname("./public")
end
namespace :assets do
desc "Precompile assets"
task :precompile do
AssetSync.sync
end
end
4 réponses
mise à Jour:
je vais maintenant utiliser la dotenv gem au lieu de l'exemple ci-dessous. Ainsi, au lieu d'ignorer l' env.rb
le fichier, je l'ignore désormais l' .env
file avec Git.
message Original:
Essayez ceci,
# /env.rb
ENV['aws_bucket'] = 'my_bucket'
ENV['aws_access_key'] = 'my_access_key'
ENV['aws_access_secret'] = 'my_access_secret'
Ce fichier définit le même ENV
valeurs heroku config
le ferait.
# /config.rb
require './env' if File.exists?('env.rb')
env.rb
obtenez seulement nécessaire si elle existe.
# /.gitignore
/env.rb
le env.rb
a été ajouté à .gitignore
le fichier pour qu'il ne soit pas conservé dans Git.
vous accéderez alors aux valeurs en utilisant ENV['key']
au lieu de config['key']
.
vous pourriez avoir besoin de changer le chemin vers le env.rb
si ce n'est pas dans le même répertoire que le config.rb
fichier.
EDIT:
en regardant votre Rakefile
dans la question précédente, vous devez le changer en ceci:
# Rakefile
require 'bundler/setup'
Bundler.require(:default)
require './env' if File.exists?('env.rb')
AssetSync.configure do |con|
con.fog_provider = 'AWS'
con.fog_region = 'eu-west-1'
con.fog_directory = ENV['aws_bucket']
con.aws_access_key_id = ENV['aws_access_key']
con.aws_secret_access_key = ENV['aws_access_secret']
con.prefix = "assets"
con.public_path = Pathname("./public")
end
namespace :assets do
desc "Precompile assets"
task :precompile do
AssetSync.sync
end
end
j'ai supposé que la seule méthode /config/config.rb
config
méthode j'ai donc supprimé l',
require './config/config.rb'
include MyConfig
Et échangé la config[key]
pour les ENV[key]
valeurs définies dans env.rb
. Vous devrez peut-être modifier le key
les noms concordent.
vous pouvez supprimer le yaml, et décrire les variables d'environnement dans un .env
le fichier puis lancer votre application avec foreman start
. Voir https://devcenter.heroku.com/articles/config-vars#local-setup
ou gardez votre système hybride, où vous chargez un yaml dans dev, et utilisez des variables d'environnement sur heroku.
je fais quelque chose de similaire à la suggestion de Sam, mais un peu différent. J'ai un fichier de configuration YAML trop, mais j'enveloppe la lecture dans une tâche Rake, qui exécute alors l'application.
# in the Rakefile
require 'yaml'
def set_connstring
s = %Q!postgres://#{ENV["DB_APP"]}@localhost/#{ENV["DB_APP"]}!
ENV['DATABASE_URL'] ||= ENV["RACK_ENV"] == "test" ? "#{s}.test" : s
end
def basic_environment
warn " Setting up environment..."
file = File.expand_path( File.join File.dirname(__FILE__), "./config.yml" )
if File.exist? file
YAML.load_file(file).each do |k,v|
warn "-> #{k}"
ENV[k.upcase] = v
end
end
set_connstring()
end
namespace :app do
desc "Set up the environment locally"
task :environment do
basic_environment()
end
desc "Run the app locally"
task :run_local => "app:environment" do
exec "bin/rackup config.ru -p #{ENV['RUN_LOCAL_PORT']}"
end
end
Cela signifie que je peux l'exécuter localement sans aucun code à l'intérieur de l'app.
Edit: un rapide de côté, j'ai remarqué que vous avez Bundler.require(:default)
dans votre Rakefile. Si vous utilisez bundle install --binstubs
alors Bundler installe tous les exécutables dans un dir nommé "bin/" dans le projet. Puis, si vous exécutez l'un de ces exécutables, ils utilisent automatiquement les bibliothèques installées par Bundler, pas besoin de passer par Bundler. Voir http://gembundler.com/v1.2/man/bundle-exec.1.html.
exporter directement depuis heroku admin: Paramètres - > Reveal Config Vars
alors ouvrez la console js du navigateur, collez ceci et tapez enter...
k=[];
$(".config-var-list input").map(function(y, x){k.push($(x).val())});
v=[];
$(".config-var-list textarea").map(function(y, x){v.push($(x).val())});
ret="";
k.map(function(x, i){ret+=k[i]+"\t"+v[2*i]+"\n"});
console.info(ret);