2013-03-22 30 views
0

看来,当我运行bundle package然后bundle install --local然后我运行unicorn_rails,独角兽仍然访问系统宝石。我不断收到:得到独角兽只能访问供应商/缓存宝石

您已启动机架1.5.2,但您的Gemfile需要机架 1.2.8。使用bundle exec可以解决这个问题。

而且它不应该因为rack 1.2.8在供应商/缓存中。

bundle exec不会工作,因为它似乎是一个资源猪,整个bundle package点是避免这一整个混乱首先。

那么如何让独角兽获得捆绑环境才能使用供应商/缓存宝石?

回答

3

bundle install --local需要使用vendor/local中的宝石,并使用任何默认的gem命令进行安装。默认情况下,这是一个系统范围的安装。如果您正在使用RVM或其他东西,它将在您当前的RVM gemset中。

如果您正在生产中进行安装,并且您想从vendor/local将应用程序限制为您的宝石,那么您需要执行bundle install --deployment。这会将宝石安装到vendor/bundle中,并将Bundler设置为使用这些宝石(并且只有那些宝石,而不是系统宝石)。如果宝石不在vendor/local中,它会下载它们。它不会更新您的Gemfile.lock,最佳做法是让您的所有宝石保持在vendor/cache以防止它甚至尝试下载宝石。

除非您正在运行某个宝石的二进制文件,否则不需要使用bundle exec。如果您运行的是rails server并且遇到此问题,原因是rails命令是从shell的$PATH运行的。这大概是Rails的一个不同于你想使用的版本。

如果是这样的话,你的选择是追查的路径,你想的rails版本并运行它明确,使用bundle exec,或运行bundle install --binstubs --deployment并添加bin目录添加到您PATH。我没有注意到任何来自bundle exec的开销,但如果你担心这一点,并且仍然希望将所有内容都包括在你的包中,那么使用--binstubs(顺便说一下,Heroku就是这么做的)。

+0

后续注意事项:在这种情况下,'rails'不再是一个问题,因为它现在只运行'script/rails'(如果存在的话),这将是Bundle范围的。有关二进制路径的其他一切仍然适用于其他宝石('rspec'是一个值得注意的宝石)。如果您正在运行'unicorn'或'foreman'或'guard'或'spork'或任何其他Ruby gem二进制文件,则需要解决路径问题。 – 2013-03-23 02:47:51

+0

感谢@Jimmy Stewart!我真的想把我所有的宝石保存在我的仓库中。我有另一个Rails应用程序运行(Redmine),似乎冲突总是在发生。此外,我不想依赖rubygems.org总是在那里或总是可用,并在某些情况下github宝石。捆绑安装--binstubs - 部署或捆绑安装 - 部署是制作“自包含”应用程序的最佳方式?如果是这样,那么如果gem现在在vendor/bundle中,那么cache目录的目的是什么? – Jon 2013-03-23 14:13:22

+1

'bundle install --binstubs --local --deployment'就是你想要的。在你的项目中创建binstubs,防止下载宝石,将宝石安装到'vendor/bundle'中,并且只使用那些宝石。 'vendor/cache'目录包含Gem_source code_('.gem'文件)。'vendor/bundle'目录中充满了解压缩,编译好的(如果需要的话),随时可用的gem。这就是'require'最终会在您的应用运行时加载它们的地方。 – 2013-03-23 17:43:16