Capistrano没有为捆绑器设置RAILS_ENV

时间:2014-05-02 02:06:14

标签: ruby-on-rails capistrano bundler capistrano3

在我的Gemfile中,我指定基于RAILS_ENV在git存储库上使用的分支。但是,当Capistrano部署时,它会运行bundle install命令 - 并且由于它是通过shell运行的,因此未设置正确的环境(分段)。它默认为开发并给出一个错误,指出Gemfile.lock与安装的内容不匹配。

  

您正在尝试在更改后以部署模式安装   的Gemfile。在其他地方运行bundle install并添加更新的   Gemfile.lock到版本控制。

     

您已添加到Gemfile:       *来源:git@bitbucket.org:MyRepository / manager-engine.git(开发时)

     

您已从Gemfile中删除:       *来源:git@bitbucket.org:MyRepository / manager-engine.git(在主人处)

     

您已在Gemfile中进行了更改:        *经理从git@bitbucket.org:MyRepository/manager-engine.git (at develop)no specified source

的Gemfile:

RAILS_ENV = ENV['RAILS_ENV'] || 'development'
gem 'manager', git: "git@bitbucket.org:MyRepository/manager-engine.git", branch: "#{ [:production, :staging].include?(RAILS_ENV.to_sym) ? :master : :develop }"

即,如果rails环境不是'production'或'staging',请使用'develop'分支。

部署/ staging.rb:

set :branch, :master
set :keep_releases, 2
set :stage, :staging
set :rails_env, 'staging'
set :bundle_without, [:development, :test]
set :deploy_to, '/home/useraccount/rails_deployments/staging.www'
server 'localhost', user: 'useraccount', roles: %w{web app db}

所以最简洁:

在常规SSH终端中,要在适当的环境下安装存储库gem,我必须发出RAILS_ENV=staging bundle install。否则,只需运行bundle install从开发分支安装存储库。由于Capistrano只运行bundle install并且不包含RAILS_ENV,因此会出现此问题。但Capistrano不设置:rails_env,还是不是真正的系统环境变量?

1 个答案:

答案 0 :(得分:0)

我想如果没有更好的方法......

我最终使用了SO中其他地方所示的方法,并根据我的需要对其进行了修改。

修改Gemfile以包含:

# Read environment from A) Explicit set through command, B) Existence of override file's contents or C) Default to development
RAILS_ENV = ENV['RAILS_ENV'] || `cat .rails-env`.to_s.split.first || 'development'

如果.rails-env不包含或不存在,则默认为开发。否则它将第一个单词作为环境。要从命令行创建文件,只需键入echo "your-environment-name-here" > .rails-env,假设您已进入应用程序的根目录。

您还可以使用上面的命令在每次使用capistrano进行部署时创建文件,或者只创建文件的符号链接并在部署之间共享:

Deploy.rb:

set :linked_files, %w{ .rails-env }

所以现在可以通过应用程序根目录中名为.rails-env的文件强制环境。明确的RAILS_ENV调用(例如RAILS_ENV=test bundle exec ...)仍然可以像宣传的那样工作。