似乎当我运行bundle package
然后bundle install --local
然后我运行unicorn_rails
时,独角兽仍在访问系统宝石。我一直在说:
您已经激活了机架1.5.2,但您的Gemfile需要机架 1.2.8。使用bundle exec可以解决这个问题。
它不应该因为机架1.2.8在供应商/缓存中。
bundle exec
不会工作,因为它似乎是一种资源匮乏,bundle package
的重点在于首先避免这种混乱。
那么我如何让独角兽获得捆绑环境以仅使用供应商/缓存宝石?
答案 0 :(得分:3)
bundle install --local
获取vendor/local
中的gem,并使用您的默认gem
命令安装它们。默认情况下,这是系统范围的安装。如果你正在使用RVM或其他东西,它将在你当前的RVM gemset中。
如果您正在制作中进行安装,并且希望将应用限制在vendor/local
的宝石中,则需要执行bundle install --deployment
。这会将宝石安装到vendor/bundle
并将Bundler设置为使用这些宝石(只有那些宝石,而不是系统宝石)。如果宝石不在vendor/local
中,它将下载它们。它不会更新您的Gemfile.lock
,最佳做法是让您的所有宝石保持最新状态,以防止它甚至尝试下载宝石。
除非您从其中一个宝石运行二进制文件,否则不需要使用vendor/cache
。如果您正在运行bundle exec
并遇到此问题,原因是rails server
命令正在从shell的rails
运行。它可能是Rails的不同版本,而不是你想要使用的版本。
如果是这种情况,您可以选择跟踪所需版本$PATH
的路径并明确运行,使用rails
,或运行bundle exec
并添加 bundle install --binstubs --deployment
目录到bin
。我没有注意到来自PATH
的任何开销,但是如果您对此感到担忧并且仍然希望将所有内容都限定在您的包中,那么请使用bundle exec
(这就是Heroku如何做到的,顺便说一下)。