在我的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,还是不是真正的系统环境变量?
答案 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 ...
)仍然可以像宣传的那样工作。