Подтвердить что ты не робот

Переменные окружения локально и Heroku

У меня есть приложение sinatra, в котором у меня есть файл yml для установки переменных среды, я вызываю их с помощью этого метода

module MyConfig

 def config
  environment = ENV["RACK_ENV"] || "development"
  YAML.load_file("./config/config.yml")[environment]
 end
 end

поэтому, когда я хочу использовать переменную, я делаю это, например,

aws_access_key_id = config['aws_access_key']

У меня есть файл .gitignore, который игнорирует config.yml, например, при нажатии на github. Итак, когда я нажимаю на герою, эти переменные среды не будут доступны?

Таким образом, это оставляет мне возможность использовать метод heroku для их настройки таким образом

heroku config:add aws_access_key= myapikey

но heroku обращается к ним как

aws_access_key_id = ENV['aws_access_key']

Как я могу настроить среду dev для использования метода config и heroku использовать ENV, я смотрю на это неправильно? или мой метод config делает это для меня?

Любая помощь оценена

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
4b9b3361

Ответ 1

Update:

Теперь я использую dotenv вместо примера ниже. Поэтому вместо игнорирования файла env.rb я теперь игнорирую файл .env с помощью Git.

Оригинальное сообщение:

Попробуйте это,

# /env.rb

ENV['aws_bucket'] = 'my_bucket'
ENV['aws_access_key'] = 'my_access_key'
ENV['aws_access_secret'] = 'my_access_secret'

Этот файл устанавливает те же самые значения ENV, что и heroku config.

# /config.rb

require './env' if File.exists?('env.rb')

env.rb будет запрашиваться только в том случае, если он существует.

# /.gitignore

/env.rb

env.rb был добавлен в файл .gitignore, поэтому он не хранится в Git.

Затем вы получите доступ к значениям, используя ENV['key'] вместо config['key'].

Вам может потребоваться изменить путь к env.rb, если он не находится в том же каталоге, что и файл config.rb.

EDIT:

От взгляда на ваш Rakefile в предыдущем вопросе вам нужно изменить его на это:

# 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

Я предположил, что единственным методом в /config/config.rb был метод config, поэтому я удалил,

require './config/config.rb'
include MyConfig

И заменил config[key] на ENV[key] значения, определенные в env.rb. Вам может потребоваться изменить имена key, чтобы они соответствовали.

Ответ 2

Вы можете удалить yaml и описать переменные среды в файле .env, затем запустите приложение с помощью foreman start. См. https://devcenter.heroku.com/articles/config-vars#local-setup


Или держите свою гибридную систему, где вы загружаете yaml в dev, и используйте переменные окружения на heroku.

Ответ 3

Я делаю что-то похожее на предложение Сэма, но немного другое. У меня также есть файл конфигурации YAML, но я завершаю его чтение в задаче Rake, которая затем запускает приложение.

# 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

Это означает, что я могу запустить его локально без кода внутри приложения, чтобы справиться с этим.


Изменить: быстро откройте, я заметил, что у вас есть Bundler.require(:default) в вашем Rakefile. Если вы используете bundle install --binstubs, тогда Bundler устанавливает все исполняемые файлы в директорию с именем "bin/" в проекте. Затем, если вы запустите любой из этих исполняемых файлов, они автоматически используют библиотеки, установленные Bundler, без необходимости использования через Bundler. См. http://gembundler.com/v1.2/man/bundle-exec.1.html.

Ответ 4

Экспортирование непосредственно из администратора heroku: Настройки → Показать карты конфигурации

Затем откройте браузер js console, вставьте его и введите 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);