【发布时间】:2011-12-29 20:07:30
【问题描述】:
您能否在不运行 bundle install... 的情况下使用 Bundler 的 Gemfile 部署 Rails3 应用程序,即只需将 Rails 项目目录复制到 Apache/Passenger 中的相应目录?
因此,在 Ruby1.8.6/Rails2 时间范围内,我们有一个为内部项目设计的遗留环境,它依赖于将本地 rails 目录复制到 Apache/Passenger 下的网络挂载。虽然这种部署模型在 Rails2 上运行良好(使用冻结的 gem 等),但在带有 Bundler 的 Rails3 上却以许多痛苦的方式中断。
具体来说,我在 :test 和 :development 组中看到 gem 的 gem 依赖错误,即使在部署到 :production 时也是如此。一开始我发现以下 SO 帖子很有帮助:
所以我在本地执行了bundle install --without test development,然后尝试手动将 .bundle/config 从我的目录复制到网络目录,但这不起作用。 Bundler 仍然尝试加载排除的 gem。
这对我们来说很痛苦,因为我们没有管理员权限在这些服务器上安装 gems(即我们不允许以任何形式运行 bundle install)。同样,管理员不希望每 5 分钟部署一次我们的应用程序,因为这是一个内部原型设计站点,而不是外部生产站点。他们也不想运行bundle install,因为他们想严格控制在所有应用程序中部署哪些 gem——例如,一些应用程序仍然基于 Rails2 并且还没有使用 Bundler,因此如果错误,它们可能会中断gem 已安装。
有没有办法以被动/rsync 的方式使用 Bundler,或者我们应该重新设计我们的环境,让开发人员通过 capistrano 或类似的方式运行bundle install?
帮助?
谢谢!
更新: 2012 年 1 月 18 日:在进一步调查了 :test 和 :development 组错误的原因后,我 discovered 发现 Phusion Passenger 在 Rails 应用程序之前实际上执行了 Bundle.setup()有机会加入boot.rb。在没有任何参数的情况下,setup() 会检查所有 gem 依赖项,这意味着如果它在服务器上找不到 gem,它甚至会在加载 Rails 之前在Passenger 中爆炸。
只有当您通过 rsync 或复制而不是在目标服务器上运行 bundle install --without test:development 进行部署时,才会发生此特定“错误”。大多数 Rails3 应用程序都使用 Capistrano 部署,它会为您完成这一步,因此永远不会遇到这种特殊的边缘情况。
所以恐怕让“组”在您的 gem 文件中正常工作的唯一方法是按预期使用 bundle install。这意味着我们应该改变我们的部署过程!
【问题讨论】:
-
您是否尝试“供应商”您的捆绑包?
-
不,我可以在明天上班时试试。 (rvm 在家里对我发火,所以我不能在这里尝试:P)
-
好的,我试过了:
RAILS_ENV=production bundle install --without test deployment debug --path vendor/bundle。试图部署它,但它失败了NoMethodError (undefined methodinit' for Mysql:Class):` mysql 在 gemset 中。哎呀,我检查了一下,mysql也在database.yml中。没有骰子。 -
您应该能够通过使用生产环境运行您的应用来测试您的 gem 配置来检查您的设置
-
嗯,这不是问题所在。它在我的本地环境中运行良好,RAILS_ENV=production。但是当我尝试在已部署的环境中运行它时,它会爆炸。
标签: ruby-on-rails bundler rsync