所以我试图在本地为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,我怎么能绕过这个?
答案 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
。