我有一个rails应用程序,它被设置为与Capistrano一起部署到两个不同的服务器中的一个(取决于用户选择部署到哪个服务器)。我想为rails应用程序创建一个环境变量,这取决于网站部署到哪个服务器。
在我的Capistrano部署(config/ployy.rb)文件中,我有一个变量"stages“,其中有两个选项供用户部署到:
set :stages, %w(production staging)我尝试在我的环境中的if语句中使用这个变量(config/ environment .so)来设置变量,如下所示:
if (:stages == "staging")
ENV['GLOBAL_EMAIL'] = "email1@domain.com"
else
ENV['GLOBAL_EMAIL'] = "email2@domain.com"
end但是,当我测试它时,rails无法呈现#{ENV['GLOBAL_EMAIL']} (据我所知,因为变量是不可设置的或不可访问的)。
我的问题是,是否有这样的理由:阶段是不可到达的,以及是否有一种方法/更好的方法来根据环境设置变量?
请注意,即使一个环境称为阶段环境,一个环境称为生产环境,但这两个环境都部署了rails的生产环境(不是rails的测试环境和生产环境),因此我无法进行测试来查看哪个环境rails正在运行,然后设置变量。
发布于 2014-02-22 19:32:44
我最后得到的解决方案是,在每个服务器上创建一个文件,其中每个文件只包含所需的电子邮件(例如,email1@domain.com),该文件来自于我的Capistrano部署(例如,在/home/user/..var/. email中)。然后在environments.rb中:
ENV['GLOBAL_EMAIL'] = begin IO.read("/home/[user]/.vars/.email") rescue "" end发布于 2014-02-17 22:14:38
首先,您试图将符号等同于字符串,而字符串总是返回false。
同样在capistrano中,要获得您在其中部署的环境,需要使用stage变量。此变量只有在加载后才可用,而不是在ruby读取文件时才可用。这意味着您需要提供一个延迟加载的块。问题是,这些值是在设置局部变量(如deploy_to )的上下文中计算的。
set(:deploy_to) { "/var/www/#{application}/#{stage}" }这是我的部署脚本中的一个常见设置,在这里,暂存和生产被部署到同一个服务器上。
你可以尝试这样的方法:
set(:global_email) do
if stage == 'production'
ENV['GLOBAL_EMAIL'] = 'email1@example.com'
else
ENV['GLOBAL_EMAIL'] = 'email2@example.com'
end
end或者处理此问题的另一种方法是使用部署阶段特定的文件。
# config/deploy/production.rb
ENV['GLOBAL_EMAIL'] = 'email1@example.com'
# config/deploy/staging.rb
ENV['GLOBAL_EMAIL'] = 'email2@example.com'更新
我没有注意到在Rails中提到的呈现值的问题。当然,这与Rails无关,在初始化Rails时,Capistrano配置文件中也没有任何设置,因为capistrano实际上应该只在开发环境中可用。
正确的方法是使用rails初始化器,并在Rails启动时设置变量。
# config/initializer/global_email.rb
if Rails.env.production?
GLOBAL_EMAIL = 'email1@example.com'
else
GLOBAL_EMAIL = 'email2@example.com'
endhttps://stackoverflow.com/questions/21839807
复制相似问题