Переменные ENV не читаются sinatra

Итак, я пытаюсь обслуживать свои статические ресурсы из Amazon s3 локально, а для Heroku я загружал файл yml, но это не работает, поскольку Heroku не принимает символические ссылки.

Поэтому мне было предложено использовать переменные ENV, поскольку Heroku также их использует. У меня есть рейк-задача - предварительно скомпилировать активы в AWS. две проблемы на данный момент

1) Мои переменные ENV не читаются (каталог тумана не может быть пустым, ключ доступа AWS не может быть пустым, секретный ключ доступа AWS не может быть пустым.

2) При запуске задачи rake я также получаю сообщение об ошибке 'уже инициализированная константа VALID_CHARACTER'

Значит, константа activesupport загружается дважды?

Моя установка

env.rb

ENV['aws_bucket'] = 'bucketname'
ENV['aws_access_key'] = 'myaccesskey'
ENV['aws_secret_key'] = 'mysecretkey'

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_secret_key']
con.prefix = "assets"
con.public_path = Pathname("./public")   
end

namespace :assets do
 desc "Precompile assets"
task :precompile do
AssetSync.sync
end

Gemfile

source :rubygems
gem 'sinatra'
gem 'pony'
gem 'sinatra-flash'
gem 'heroku'
gem 'asset_sync', git: 'git://github.com/ejholmes/asset_sync.git', branch: 'sinatra'

ОБНОВИТЬ

AssetSync имеет активную поддержку в своем gemspec, так что он будет включен в любом случае. Кажется, это противоречит константе, определенной в почтовом геме из gempec pony.

Итак, с удаленным драгоценным камнем Pony я могу предварительно скомпилировать активы локально, но когда я пытаюсь скомпилировать для heroku, ничего не происходит, он запускает задачу rake, но затем просто возвращается в терминал, готовый к новой команде.

Во-вторых, мне нужен Pony для почтовой программы, как я могу это обойти?


person Richlewis    schedule 18.03.2013    source источник
comment
вы устанавливаете переменные ENV с помощью инструмента heroku iirc.   -  person three    schedule 19.03.2013
comment
Ах, даже если я устанавливаю ENV в приложении, heroku их не читает   -  person Richlewis    schedule 19.03.2013
comment
См. devcenter.heroku.com/articles/config-vars.   -  person iain    schedule 19.03.2013
comment
@Richlewis, да, переменные ENV, как и вары оболочки, а не только вары приложений :)   -  person three    schedule 19.03.2013


Ответы (2)


Чтобы избежать конфликта между Pony и локальным запуском Rake, поместите драгоценные камни в разные группы, например

# Gemfile
group :assets do
  gem 'asset_sync', git: 'git://github.com/ejholmes/asset_sync.git', branch: 'sinatra'
end

group :mail do
  gem "pony"
end

# more…

в Rakefile

Bundler.require(:assets,:database,:whatever_else_you_need)

в файле стеллажа / приложения

Bundler.require(default,:assets,:database,:mail,:whatever_else_you_need)

Что касается другой вашей проблемы, вам следует установить переменные env для производства через heroku config (см. https://devcenter.heroku.com/articles/config-vars) и загрузить их локально с помощью файла Rakefile как я сказал в другом вопросе, который вы задали об этом. Переменные env будут существовать на протяжении всего процесса Ruby, поэтому, если вы загрузите их через Rake и также запустите локальный сервер в том же процессе Rake, вы получите Sinatra, собирающий все переменные env .


Изменить: переменные env будут длиться до тех пор, пока процесс, который их добавил, поэтому, если вы поместите их в зависимую задачу, следующая задача будет иметь к ним доступ:

namespace :assets do

  task :environment do
    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_secret_key']
      con.prefix = "assets"
      con.public_path = Pathname("./public")   
    end
  end

 desc "Precompile assets"
 task :precompile => :"assets:environment" do
   AssetSync.sync
 end
person iain    schedule 19.03.2013
comment
Привет, спасибо за ваш ответ, я не совсем понял процесс в вашем последнем ответе на мой предыдущий вопрос, хотя этот я понимаю. Что касается варов ENV, отправленных на heroku, мне нужно только добавить ENV, да? о таких вещах, как fog_provider, нужно позаботиться в моем блоке AssetSync? - person Richlewis; 19.03.2013
comment
@Richlewis Я добавил немного к ответу, но вам решать, что вы добавляете в ENV. В настоящее время я стараюсь придерживаться как можно большего количества, одного через конфигурационный файл, который находится в системе управления версиями, и любую конфиденциальную информацию, которую я помещаю в файл secret_settings, который не находится в системе управления версиями. Почти все, что вы бы жестко запрограммировали, я вставляю в ENV. Это так удобно, а почему бы и нет? - person iain; 19.03.2013

Вы можете разделить это на разные вопросы. Так вам будет легче помочь. Что касается вашего первого вопроса: я полагаю, вы не поставили env.rb под контроль версий?

Почему ваши env vars не обрабатываются Sinatra? Потому что вы настраиваете Fog в Rakefile, и Simatra никогда не видит этот файл. Используется только граблями.

Я бы посоветовал вам поместить конфигурацию тумана в третий файл и require его как в Rakefile, так и в приложение Sinatra.

person awendt    schedule 18.03.2013
comment
да env.rb находится в моем файле gitignore, поэтому туман установлен так con.fog_directory = ENV ['applecatering'? - person Richlewis; 19.03.2013
comment
Могу я просто поместить всю задачу в отдельный файл? - person Richlewis; 19.03.2013
comment
Спасибо, я перенес конфиг в отдельный файл и требуя его, локально все нормально. Могу я спросить, зачем нам это нужно в самом приложении sinatra? - person Richlewis; 19.03.2013
comment
Насколько я понимаю, нужно настроить Fog на грабли и Синатру, да? - person awendt; 19.03.2013
comment
ну, у меня нет необходимости в моем файле приложения sinatra, и он работает локально, просто на данный момент у меня мало проблем с heroku - person Richlewis; 19.03.2013