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
13
demandé sur Richlewis 2013-03-18 01:47:02

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.rbconfig 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.

17
répondu Sam 2015-01-19 14:48:23

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.

1
répondu Colonel Panic 2013-03-17 23:12:44

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.

1
répondu iain 2013-03-18 14:50:52

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);
0
répondu Tom Lobato 2015-08-18 08:08:20