Переменные среды локально и 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 установить их так

heroku config:add aws_access_key= myapikey

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

aws_access_key_id = ENV['aws_access_key']

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

Любая помощь приветствуется

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

person Richlewis    schedule 17.03.2013    source источник


Ответы (4)


Обновление:

Теперь я использую гем 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.

ИЗМЕНИТЬ:

Из вашего 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, чтобы они совпадали.

person Sam    schedule 18.03.2013
comment
Еще раз спасибо за вашу помощь, Сэм, на этот раз после запуска heroku run rake assets:precompile я получаю Нет такого файла или каталога - /config/config.yml, который я так понимаю находится в файле .gitignore? есть идеи, как обойти это? - person Richlewis; 18.03.2013
comment
Попробуйте удалить YAML.load_file("./config/config.yml")[environment]. Поскольку вы заменили файл YAML файлом env.rb, вам больше не нужно его включать. - person Sam; 18.03.2013
comment
да, я пробовал это, но затем я получаю неопределенный метод или конфигурацию локальной переменной, так как мой файл rake вызывает метод, я разместил файл rake - person Richlewis; 18.03.2013
comment
Вам нужно будет переместить все ваши свойства YAML config[key] в свойства env.rb и изменить их на свойства ENV[key]. Затем удалите все ссылки на метод config[key] в MyConfig. - person Sam; 18.03.2013
comment
большое спасибо, поэтому, если я не собирался использовать heroku, я мог бы придерживаться пути config.yml, но опять же, ваш метод работает так же хорошо, даже если я не использовал heroku - person Richlewis; 18.03.2013
comment
Да, я думаю, что способ YAML чище, если вы можете сделать символическую ссылку на сервере. Heroku использует ENV для своей конфигурации и не разрешает символические ссылки, поэтому здесь больше подходит env.rb. - person Sam; 18.03.2013
comment
почти готово, теперь предупреждение об ошибке: уже инициализирована константа VALID_CHARACTER, после некоторого чтения я не вижу ничего плохого в моих переменных, я предполагаю, что с ENV нет проблем? - person Richlewis; 18.03.2013
comment
Возможно, вы определили VALID_CHARACTER дважды? Может в разных файлах? Эта ошибка означает, что константа ruby ​​с именем VALID_CHARACTER была определена более одного раза. Рубиновая константа должна быть определена только один раз и не должна изменяться. - person Sam; 18.03.2013
comment
я даже не вижу, как это определено - person Richlewis; 18.03.2013
comment
Попробуйте удалить строки require 'active_support/core_ext' и require 'asset_sync'. Gemfile уже должен требовать их. Ответ обновлен. - person Sam; 18.03.2013
comment
все еще получаю предупреждение: уже инициализирована константа VALID_CHARACTER, директория тумана не может быть пустой - person Richlewis; 18.03.2013
comment
Ваш ключ ENV[] в файле rakefile совпадает с ключом в файле env.rb для корзины? - person Sam; 18.03.2013
comment
ENV['aws_bucket'] = 'яблочное питание' (env) и con.fog_directory = ENV['aws_bucket'] (rakefile) - person Richlewis; 18.03.2013
comment
у меня есть файл env.rb в этой структуре config/env.rb, так что это правильно, да? требуется './env', если File.exists?('env.rb') - person Richlewis; 18.03.2013
comment
Ах! Добавьте require './config/env' if File.exists?('config/env.rb') к Rakefile. Он был удален, когда был удален config.rb. - person Sam; 18.03.2013
comment
У меня сейчас нет идей. Возможно, придется вернуться к этому позже. VALID_CHARACTER — это константа в ActiveSupport, и я думаю, что она определяется дважды, но я не уверен, почему. - person Sam; 18.03.2013
comment
хорошо, так что в моем gemfile у меня есть гем «activesupport», требуйте: «active_support», активная поддержка идет по умолчанию, не так ли? - person Richlewis; 18.03.2013
comment
я удалил активную поддержку gem, а затем повторно запустил пакет без этого в файле gem, все та же проблема - person Richlewis; 18.03.2013
comment
Я бы посоветовал игнорировать предупреждающее сообщение. AssetSync имеет activesupport в спецификации gemspec, так что он в любом случае будет включен. Похоже, это конфликтует с константой, определенной в mail gem из pony gemspec. Если вы удалите камень «пони», предупреждение прекратится. Есть ли другие сообщения об ошибках после удаления драгоценного камня pony? - person Sam; 19.03.2013
comment
Спасибо, Сэм, но мне нужен Pony Gem для моей почтовой программы, я попробую, просто чтобы посмотреть, действительно ли сообщение исчезнет, ​​но что тогда? - person Richlewis; 19.03.2013
comment
Команда rake для heroku ничего не компилирует? просто запускает грабли, а затем возвращается к терминалу, готовому к новой команде - person Richlewis; 19.03.2013
comment
на самом деле только что проверил мою учетную запись aws, и последнее обновление было вчера, а не задача rake, которую я только что выполнил - person Richlewis; 19.03.2013
comment
Спасибо! В моем случае Heroku использует файл config.ru (расширение .ru) - person Sylar; 26.10.2018

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


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

person Colonel Panic    schedule 17.03.2013

Я делаю что-то похожее на предложение Сэма, но немного по-другому. У меня тоже есть конфигурационный файл 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.

person iain    schedule 18.03.2013

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

Затем откройте консоль браузера js, вставьте это и введите 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);
person Tom Lobato    schedule 18.08.2015