【发布时间】:2011-12-12 03:28:20
【问题描述】:
我需要找到一种从 Capistrano 设置全局环境变量的方法。实际值是在运行时生成的,我无法在 repo 中检查它并从那里加载。
这个值必须在一个初始化器中加载为ENV['RAILS_ASSET_ID']。
我该怎么做?
【问题讨论】:
标签: ruby-on-rails environment-variables capistrano
我需要找到一种从 Capistrano 设置全局环境变量的方法。实际值是在运行时生成的,我无法在 repo 中检查它并从那里加载。
这个值必须在一个初始化器中加载为ENV['RAILS_ASSET_ID']。
我该怎么做?
【问题讨论】:
标签: ruby-on-rails environment-variables capistrano
作为一种解决方法,到目前为止我一直在使用这种方法:
desc 'My custom task'
task :task_foo do
asset_version = 12345
system "echo #{asset_version} > RAILS_ASSET_ID"
end
并在初始化程序中检索:
File.open(Rails.root.join 'RAILS_ASSET_ID').read.strip]
但必须有更好的方法。有什么想法吗?
【讨论】:
echo #{asset_version} >> #{current_path}/config/initializers/asset_version.rb
>> 是一种安全机制,以防开发人员有一天创建了该文件。
在你的初始化器中指定它怎么样?
ENV['RAILS_ASSET_ID'] = 12345
【讨论】:
如果你所说的全局变量是指在 Capistrano 中生成并随后在 Rails 中使用的东西,那么是的,你将不得不创建某种文件。 Ruby 变量在运行之间不会持续存在。环境变量可以设置,但只适用于子进程。
在部署期间将文件转储到服务器上的一种方法就像您在服务器上所拥有的一样,只有远程:
run "echo #{asset_version} > #{release_path}/config/asset_version.conf"
您稍后可以在完成后拾取并读取该值。
【讨论】:
你不能使用default_environment capistrano 变量吗?
cfgithub/capistrano
例如,我们可以将它用于生产中的 rbenv :
set :default_environment, {
'PATH' => "$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH"
}
【讨论】: