【问题标题】:can bundler be used in rsync deployments?bundler 可以在 rsync 部署中使用吗?
【发布时间】: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 method init' for Mysql:Class):` mysql 在 gemset 中。哎呀,我检查了一下,mysql也在database.yml中。没有骰子。
  • 您应该能够通过使用生产环境运行您的应用来测试您的 gem 配置来检查您的设置
  • 嗯,这不是问题所在。它在我的本地环境中运行良好,RAILS_ENV=production。但是当我尝试在已部署的环境中运行它时,它会爆炸。

标签: ruby-on-rails bundler rsync


【解决方案1】:

我和其他一些 Rails 开发人员正在讨论如何在 Rails 3 中有效地冻结 gem,我们制定了这个解决方案。这与@asymmetric 提议的内容一致,但在某些关键方面有所不同。正如我后来从 gemfile 手册页中发现的那样,这种方法也受到 @indirect 警告 bundle install --deployment 的相同限制,因为您的 gem 必须是纯 ruby​​(无本机编译),或者这些步骤必须在与您的舞台和产品服务器相同的架构。

好的,现在我们已经完成了准备工作,让我们看看如何将一些 gem“冻结”到 Rails 3 中...

首先,从干净的环境开始:

$ rvm gemset use fresh
$ rvm gemset empty fresh
$ gem install rails
$ rails new strawman
$ cd strawman/

接下来,安装你要使用的 gem:

$ gem install condi

接下来,创建一个vendor/gems 目录并解压其中的gem:

$ mkdir vendor/gems
$ cd vendor/gems
$ gem unpack condi
Unpacked gem: '/tmp/strawman/vendor/gems/condi-0.0.6'

可选

如果您的 gem 没有 .gemspec 文件(即规范是包含的 Rakefile 构建的一部分),Bundler 可能无法使用 :path 语句正确加载它。在这种情况下,您必须使用以下命令从 gem 文件中输出 gemspec:

$ gem specification /tmp/condi-0.0.6.gem > condi-0.0.6/condi.gemspec

或者,如果您已经在本地安装了 gem,您可以:

$ gem specification condi -v=0.0.6 > condi-0.0.6/condi.gemspec

现在,将Gemfile 更新为:

gem 'condi', '0.0.6', :path => 'vendor/gems/condi-0.0.6'

注意:“与 :git 不同,bundler 不会为指定为路径的 gem 编译 C 扩展。” [man gemfile] 所以这个适用于没有原生扩展的纯红宝石宝石!请注意!

接下来,从 gemset 中卸载 gem:

$ gem uninstall condi
Successfully uninstalled condi-0.0.6

并返回到 rails 根环境,尝试运行 rails 控制台:

$ cd ../..
$ rails c
Loading development environment (Rails 3.1.3)
1.9.3-p0 :001 > 

成功!!现在,您的纯 ruby​​ gem 已在 Rails 3 应用程序中冻结

【讨论】:

    【解决方案2】:

    是的,你可以。您必须找到一台与您的生产服务器具有完全相同的操作系统/架构组合的机器,然后在其上运行bundle install --deployment。完成后,您可以复制整个应用程序目录(包括 ./vendor/bundle,其中包含所有已安装的 gem)。由于所有 gem 都已安装并编译,因此您的应用将启动。

    也就是说,这是官方不支持的。如果您对该方法有疑问,虽然 Bundler 团队会尽力帮助您,但不能保证它会起作用(或在未来继续工作)。这里是龙,等等,等等。

    【讨论】:

    • 请注意,这个答案与上面的答案有很大不同:您必须使用与您的生产机器相同的机器(在操作系统、处理器架构、ruby 版本和安装的 C 库中)。这是这种方法可能起作用的唯一方法。
    【解决方案3】:

    不是您问题的直接答案,但您不需要管理员权限即可安装 gem - 您可以将它们本地安装到您的应用位置:

    bundle install --path vendor/bundle
    

    这也将这个应用程序的环境与其他应用程序的环境隔离,就 gems 而言(即“系统”gems 保持安静)。

    记得在每次调用 gem 之前加上 bundle exec

    您可能还想查看rvm 及其gemsets

    【讨论】:

    • 如果可能的话,我会建议这种方法。如果您的 gem 或其依赖项有任何本机代码,则 rsync 方法可能不起作用。
    • 有两种方法可以做到这一点,AFAIK,1)在本地执行此操作,然后将文件复制过来(但这不起作用,请参阅问题 cmets),或 2)登录到部署服务器并在那里运行bundle install 命令。但是,我们没有对该服务器的 shell 访问权限,我们只有将文件复制到部署目录的权限。还有其他方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多