首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为不同的Capistrano环境将Rails变量设置为不同的值

为不同的Capistrano环境将Rails变量设置为不同的值
EN

Stack Overflow用户
提问于 2014-02-17 21:41:02
回答 2查看 1.7K关注 0票数 0

我有一个rails应用程序,它被设置为与Capistrano一起部署到两个不同的服务器中的一个(取决于用户选择部署到哪个服务器)。我想为rails应用程序创建一个环境变量,这取决于网站部署到哪个服务器。

在我的Capistrano部署(config/ployy.rb)文件中,我有一个变量"stages“,其中有两个选项供用户部署到:

代码语言:javascript
复制
set :stages, %w(production staging)

我尝试在我的环境中的if语句中使用这个变量(config/ environment .so)来设置变量,如下所示:

代码语言:javascript
复制
if (:stages == "staging")
    ENV['GLOBAL_EMAIL'] = "email1@domain.com"
else
    ENV['GLOBAL_EMAIL'] = "email2@domain.com"
end

但是,当我测试它时,rails无法呈现#{ENV['GLOBAL_EMAIL']} (据我所知,因为变量是不可设置的或不可访问的)。

我的问题是,是否有这样的理由:阶段是不可到达的,以及是否有一种方法/更好的方法来根据环境设置变量?

请注意,即使一个环境称为阶段环境,一个环境称为生产环境,但这两个环境都部署了rails的生产环境(不是rails的测试环境和生产环境),因此我无法进行测试来查看哪个环境rails正在运行,然后设置变量。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-22 19:32:44

我最后得到的解决方案是,在每个服务器上创建一个文件,其中每个文件只包含所需的电子邮件(例如,email1@domain.com),该文件来自于我的Capistrano部署(例如,在/home/user/..var/. email中)。然后在environments.rb中:

代码语言:javascript
复制
ENV['GLOBAL_EMAIL'] = begin IO.read("/home/[user]/.vars/.email") rescue "" end
票数 0
EN

Stack Overflow用户

发布于 2014-02-17 22:14:38

首先,您试图将符号等同于字符串,而字符串总是返回false。

同样在capistrano中,要获得您在其中部署的环境,需要使用stage变量。此变量只有在加载后才可用,而不是在ruby读取文件时才可用。这意味着您需要提供一个延迟加载的块。问题是,这些值是在设置局部变量(如deploy_to )的上下文中计算的。

代码语言:javascript
复制
set(:deploy_to) { "/var/www/#{application}/#{stage}" }

这是我的部署脚本中的一个常见设置,在这里,暂存和生产被部署到同一个服务器上。

你可以尝试这样的方法:

代码语言:javascript
复制
set(:global_email) do
  if stage == 'production'
    ENV['GLOBAL_EMAIL'] = 'email1@example.com'
  else
    ENV['GLOBAL_EMAIL'] = 'email2@example.com'
  end
end

或者处理此问题的另一种方法是使用部署阶段特定的文件。

代码语言:javascript
复制
# 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启动时设置变量。

代码语言:javascript
复制
# config/initializer/global_email.rb

if Rails.env.production?
  GLOBAL_EMAIL = 'email1@example.com'
else
  GLOBAL_EMAIL = 'email2@example.com'
end
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21839807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档