您是否可以使用Bundler的Gemfile部署Rails3应用程序而不运行bundle install
...即只是将rails项目目录复制到Apache / Passenger中的相应目录?
因此,我们有一个在Ruby1.8.6 / Rails2时间范围内为内部项目设计的遗留环境,它依赖于将本地rails目录复制到Apache / Passenger下的网络安装。虽然这种部署模式适用于Rails2(带有冻结的宝石等),但它对于使用Bundler的Rails3来说有很多痛苦的方法。
具体来说,我看到gems中的gem依赖错误:test和:开发组,即使在部署到:production时也是如此。我发现以下SO帖子有帮助:
所以我在我的本地执行bundle install --without test development
然后尝试手动将.bundle / config从我的目录复制到网络目录,但这不起作用。 Bundler仍试图加载被排除的宝石。
这对我们来说很痛苦,因为我们没有管理员权限在这些服务器上安装gem(即我们不允许以任何形式运行bundle install
)。同样,管理员不希望每5分钟部署我们的应用程序,因为这是一个内部原型网站,而不是外部生产网站。他们也不想运行bundle install
,因为他们想要严格控制在所有应用程序中部署哪些宝石 - 例如,某些应用程序仍然基于Rails2而且还没有使用Bundler,所以它们可能会破坏安装了错误的宝石。
有没有办法以被动/ rsync方式使用Bundler,还是应该重新设计我们的环境,让开发人员通过capistrano或其他类似的方式运行bundle install
?
帮助?
谢谢!
更新: 2012年1月18日:在调查了:test和:开发组错误的原因之后,Phusion Passenger实际执行的discovered Bundle.setup()
在Rails应用程序有机会进入boot.rb
之前。没有任何参数,setup()
检查所有gem依赖项,这意味着如果它没有在服务器上找到gem,它会在它甚至有机会加载Rails之前在Passenger中爆炸。
只有通过rsync或copy进行部署而不是在目标服务器上运行bundle install --without test:development
时,才会出现此特定“错误”。大多数Rails3应用程序都与Capistrano一起部署,后者为您执行此步骤,因此从未遇到过这种特殊的边缘情况。
所以我担心让'groups'在你的gem文件中正常工作的唯一方法就是按预期使用bundle install
。这意味着我们应该改变我们的部署过程!
答案 0 :(得分:2)
不能直接回答您的问题,但您不需要管理员权限来安装宝石 - 您可以在本地将其安装到应用的位置:
bundle install --path vendor/bundle
对于宝石而言,这也会将此应用程序的环境与其他应用程序隔离开来(即“系统”宝石保持平静)。
请记住使用bundle exec
预先对每个宝石进行调用。
您可能还想查看rvm及其 gemsets
答案 1 :(得分:1)
是的,你可以。您必须找到与生产服务器具有完全相同的OS /体系结构组合的计算机,然后在其上运行bundle install --deployment
。完成后,您可以复制整个应用程序目录(包括./vendor/bundle
,其中包含所有已安装的宝石)。由于宝石都已经安装和编译,你的应用程序才会启动。
尽管如此,这是官方不支持的。如果您对该方法有疑问,而Bundler团队会尽力帮助您,则无法保证它能够正常工作(或继续保持未来的工作)。这里可能是龙等等。