ENV变量未被读取sinatra

时间:2013-03-18 20:27:17

标签: heroku sinatra environment-variables activesupport

所以我试图在本地为Amazon s3提供我的静态资产,而对于Heroku,我正在加载一个yml文件但是这不起作用,因为Heroku不接受符号链接。

所以我得到了使用ENV变量的建议,因为Heroku也使用这些。我有一个rake任务来将资产预编译到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'

Rake文件

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中具有activesupport,以便以任何方式包含它。它似乎与小马gemspec的邮件宝石中定义的常量相冲突。

因此删除了Pony gem我可以在本地预编译资产,但是当我尝试编译heroku没有任何反应时,它会启动rake任务,但之后只需返回终端准备新命令。

另一件事是我的邮件需要Pony,我怎么能绕过这个?

2 个答案:

答案 0 :(得分:2)

要摆脱Pony与本地运行Rake之间的冲突,put the gems into different groups,例如

# 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)

在rackup / app文件中

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

关于您的其他问题,您应该通过heroku config(请参阅https://devcenter.heroku.com/articles/config-vars)为生产设置环境变量,并使用Rakefile as I said in the other question you asked about this在本地加载它们。 env vars将在Ruby进程的范围内存在,所以如果你通过Rake加载它们并且在同一个Rake过程中启动本地服务器,你将获得Sinatra获取所有的env vars


编辑:env vars将持续与添加它们的进程一样长,因此如果您将它们放入从属任务中,则以下任务可以访问它们:

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

答案 1 :(得分:1)

您可能希望将其拆分为不同的问题。这样可以更轻松地为您提供帮助。至于你的第一个问题:我假设你没有将env.rb置于版本控制之下?

为什么Sinatra没有选择你的环境变量?因为你在Rakefile中配置了Fog,而Simatra从未看到过那个文件。它仅由rake使用。

我建议您将Fog配置放入Rakefile和Sinatra应用程序中的第三个文件和require