如何使用bundler重新安装gem

时间:2012-08-30 01:45:00

标签: ruby rubygems bundler

我做了一个bundle show并获得了一个gem目录的完整路径。

不幸的是,我使用rm -r gem_path删除了目录。然后我的rails应用程序不再工作了。如果我尝试启动服务器或启动rails控制台,则会输出以下错误:

  

<class:Application>:未初始化的常量MyAPP::Application::Gem(NameError)

我该怎么做才能让它回来?

我尝试bundle installbundle update,希望强制捆绑搜索gem并重新安装,但无效。

我也尝试删除Gemfile.lock并运行bundle install。什么都没有改变,同样的错误。

有问题的宝石是Act as taggable on

8 个答案:

答案 0 :(得分:49)

如果使用rbenv,这将让你完全卸载并重新安装一个gem,例如rmagick:

首先:尝试简单的卸载/重新安装

gem uninstall rmagick
bundle install

如果这不起作用,您可以删除已安装gem的所有痕迹。找到您的宝石安装位置:

bundle show rmagick
BUNDLE_DIR=$(dirname $(dirname $(bundle show rmagick)))
echo $BUNDLE_DIR

您的宝石安装前缀将是默认值,例如~/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0或您设置的内容,例如.vendor

清除gem目录:

rm -rf $BUNDLE_DIR/gems/rmagick-*

清除已编译的gem缓存:

rm $BUNDLE_DIR/cache/rmagick*.gem

同时清除bundler的规范缓存:

rm $BUNDLE_DIR/specifications/rmagick*gemspec

然后你可以重新安装:

bundle install

答案 1 :(得分:37)

您可以随时使用:

gem pristine acts-as-taggable-on

pristine - 将已安装的gems从位于gem缓存中的文件恢复到pristine状态

如果您只想恢复当前项目的gem,则应该运行:

bundle exec gem pristine acts-as-taggable-on

答案 2 :(得分:14)

首先我做了一个gem q --Lgem query --local的快捷方式。它输出我安装的所有本地宝石。

actionmailer (3.2.8, 3.2.6, 3.2.1, 3.1.0)
actionpack (3.2.8, 3.2.6, 3.2.1, 3.1.0)
activemodel (3.2.8, 3.2.6, 3.2.1, 3.1.0)
activerecord (3.2.8, 3.2.6, 3.2.1, 3.1.0)
activeresource (3.2.8, 3.2.6, 3.2.1, 3.1.0)
activesupport (3.2.8, 3.2.6, 3.2.1, 3.1.0)
acts-as-taggable-on (2.3.3)
...

然后,根据DVG建议,我使用正确的名称gem uninstall acts-as-taggable-on卸载了gem并运行bundle install。之后,我再次rails crails s没有任何问题。

答案 3 :(得分:10)

从终端的项目目录

gem uninstall gem_name 

答案 4 :(得分:9)

如果在~/.rvm/中使用RVM宝石,如果bundle未重新安装宝石,则此方法有效。

首先,删除宝石源:

bundle show $GEM
rm -rf $PATH_TO_GEM

清除已编译的gem缓存:

rm -rf ~/.rvm/gems/ruby-$RUBYVERSION[@$GEMSET]/cache/$GEM.gem

同时清除bundler的规范缓存:

rm -rf ~/.rvm/gems/ruby-$RUBYVERSION[@$GEMSET]/specifications/$GEM*gemspec

然后你可以重新安装:

bundle install

答案 5 :(得分:5)

如果你已安装到./bundle/vendor或类似的,你需要首先删除gem,但明确指定GEM_HOME,例如。

GEM_HOME=./vendor/bundle/ruby/2.3.0/ gem uninstall rmagick

这是将使用bundler安装的gems卸载到供应商目录中的最简单方法。理想情况下,会有一个命令bundle uninstallbundle reinstall等等。

如果您的目标只是重新安装,以下命令将有所帮助:

GEM_HOME=./vendor/bundle/ruby/2.3.0/ gem uninstall rmagick && sudo -u http bundle install

如果您像我一样并且在目录下有多个Web应用程序(例如/srv/http),则以下内容将在所有目录中执行:

cd /srv/http
for d in ./*/ ; do (cd "$d" && sudo -u http GEM_HOME=./vendor/bundle/ruby/2.4.0/ gem uninstall --force rmagick && sudo -u http bundle install); done

答案 6 :(得分:3)

如果您尝试重新安装rake,gem pristine rake将失败并显示Skipped rake-10.X.X, it is a default gem,而捆绑包也不会安装它,因为它无法卸载它。

如果您使用的是rvm,那么最简单的方法就是执行rvm reinstall 2.x.x。至少对我来说,rvm repair all也没有帮助。

同样可能适用于所有其他默认宝石。我会在这里列出它们,以便绝望的googlers找到一些帮助:

  • bigdecimal
  • io-console
  • json
  • minitest
  • psych
  • rake
  • rbtree
  • 的RDoc
  • 测试单元

答案 7 :(得分:3)

bundle exec gem uninstall <gem_name> - 从捆绑包中卸载gem(<app_root>/vendor/bundle/ruby/2.3.0/gems/路径)。这相当于@ioquatix给出的答案,但是他正在寻找的是更方便的解决方案。

gem uninstall <gem_name> - 仅从系统中的全局gemset卸载gem