【问题标题】:Capistrano doesn't set RAILS_ENV for bundlerCapistrano 没有为捆绑程序设置 RAILS_ENV
【发布时间】:2014-06-18 15:19:21
【问题描述】:

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

您在更改您的配置后尝试在部署模式下安装 宝石文件。在别处运行bundle install 并添加更新的 Gemfile.lock 到版本控制。

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

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

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

宝石文件:

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 环境不是“生产”或“暂存”,则使用“开发”分支。

部署/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,还是不是真正的系统环境变量?

【问题讨论】:

    标签: ruby-on-rails capistrano bundler capistrano3


    【解决方案1】:

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

    我最终使用了 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 部署时创建文件,或者只是创建文件的符号链接并在部署之间共享它:

    部署.rb:

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

    所以现在可以通过应用程序根目录中名为 .rails-env 的文件来强制环境。诸如RAILS_ENV=test bundle exec ... 之类的显式 RAILS_ENV 调用仍将像宣传的那样工作。

    【讨论】:

    • 如果 .rails-env 不存在,上面的 RAILS_ENV= 会在 cat 上抛出错误,另一种方法是在顶部使用这个 RAILS_ENV = ENV['RAILS_ENV'] || ( File.exist?('.rails-env') ? File.read('.rails-env') : 'development' )
    • 如果你想让这条线正常工作,那么它应该是这样的: ENV['RAILS_ENV'] ||= ( File.exist?('.rails-env') ? File.read ('.rails-env').to_s.split.first : '发展')
    • 另一个要添加的注释,在您的 spec_helper.rb 文件中,确保环境明确设置为“测试”,因为这会覆盖它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多