Answers:
使用bundle exec
是正确的方法。
基本上发生的是,您已将rake更新为0.9.2,现在它与Gemfile中指定的版本冲突。以前,rake
您的最新版本与Gemfile中的版本匹配,因此仅使用时就不会收到任何警告rake
。
Yehuda Katz(Bundler的最初开发者之一)在此博客文章中对此进行了解释。
为了避免一直输入bundle exec ...
,可以在外壳程序中为Bundler常用的命令设置别名或函数。例如,这是我在Rake中使用的:
$ type bake
bake is a function
bake ()
{
bundle exec rake "$@"
}
如果您有理由保留当前版本的rake(或任何其他引起问题的gem),那么matt是正确的,最好的方法是运行bundle exec
。这将使用Gemfile中指定的版本,而不是使用已安装的gem的最新版本。(如果您不想每次运行rake都键入以下内容, nathan.f77在下面有一个很好的解决方案bundle exec
)
否则,如果没有理由不更新耙,则可以运行
bundle update rake
这实际上将更新您的Gemfile.lock以使用最新版本的rake,而不必bundle exec
每次都运行。
注意:如果仅运行bundle update
此命令,它将更新Gemfile中的所有gem,而不是仅仅更新rake,这可能不是您想要的,因为如果应用程序发生故障,您将不知道是哪个gem更新导致了它。
不推荐使用而不必使用较旧版本的方法bundle exec
是卸载rake的较新版本。
$ gem卸载耙 选择要卸载的宝石: 1.耙0.8.7 2.耙-0.9.2 3.所有版本 > 2 成功卸载了rake-0.9.2
这行得通,但是如果您正在使用使用不同版本rake的多个应用程序,则可能会很痛苦,因为您将发现自己不断需要安装和卸载不同版本。
gem install rake
。然后gem uninstall rake
选择0.9.2。
bundle update
还会将没有指定版本的所有gem更新为可用的最新版本。那可能不是您想要的。bundle update rake
将会更多。
public_suffix
而不是rake
。bundle update public_suffix
不幸的是,跑步没有任何效果。
尝试 bundle clean --force
它将删除此捆绑包中未包含的所有系统gem
bundle exec
是正确的,但您不想每次都键入它。
您可以将其放在您的.bashrc中:
# Automatically invoke bundler for rake, if necessary.
rake() { if [ -e ./Gemfile.lock ]; then bundle exec rake "$@"; else /usr/bin/env rake "$@"; fi; }