0

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

所以我得到了使用 ENV 变量的建议,因为 Heroku 也使用这些变量。我有一个 rake 任务将资产预编译到 AWS。目前有两个问题

1) 我的 ENV 变量没有被读取。(雾目录不能为空,Aws 访问密钥不能为空,Aws 秘密访问密钥不能为空

2) 运行 rake 任务时,我还收到错误“已初始化常量 VALID_CHARACTER”

那么 activesupport 常量被加载了两次?

我的设置

环境.rb

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

耙文件

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

宝石文件

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 中具有积极的支持,因此可以以任何方式包含在内。它似乎与小马 gemspec 的邮件 gem 中定义的常量冲突。

因此,删除 Pony gem 后,我可以在本地预编译资产,但是当我尝试为 heroku 编译时,什么也没有发生,它会启动 rake 任务,但随后会返回终端准备执行新命令。

另一件事是我的邮件需要 Pony,我该如何解决这个问题?

4

2 回答 2

2

为了消除 Pony 和在本地运行 Rake 之间的冲突,将 gems 放入不同的组中,例如

# 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 在本地加载它们,正如我在您询问的另一个问题中所说的那样这个。环境变量将在 Ruby 进程的范围内存在,因此如果您通过 Rake 加载它们并在同一个 Rake 进程启动本地服务器,您将让 Sinatra 获取所有环境变量。


编辑: 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
于 2013-03-19T00:23:40.937 回答
1

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

为什么您的环境变量没有被 Sinatra 拾取?因为您在 Rakefile 中配置了 Fog,而 Simatra 永远不会看到该文件。它仅由 rake 使用。

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

于 2013-03-18T21:12:54.330 回答