首页 文章

如何使用bundler重新安装gem

提问于
浏览
50

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

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

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

What should I do to have it back?

我试图 bundle installbundle update 希望强制捆绑搜索gem并重新安装,但是没有用 .

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

有问题的宝石是Act as taggable on .

8 回答

  • 13

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

    第一:尝试简单的卸载/重新安装

    gem uninstall rmagick
    bundle install
    

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

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

    您的gem安装前缀将是默认值,例如 ~/.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的spec缓存:

    rm $BUNDLE_DIR/specifications/rmagick*gemspec
    

    然后你可以重新安装:

    bundle install
    
  • 37

    你可以随时使用:

    gem pristine acts-as-taggable-on

    pristine - 从位于gem缓存中的文件将已安装的gem恢复为pristine条件

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

    bundle exec gem pristine acts-as-taggable-on

  • 9

    首先,我做了一个 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 没有任何问题 .

  • 10

    从终端的项目目录

    gem uninstall gem_name
    
  • 5

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

    首先,删除gem源:

    bundle show $GEM
    rm -rf $PATH_TO_GEM
    

    清除已编译的gem缓存:

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

    同时清除bundler的spec缓存:

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

    然后你可以重新安装:

    bundle install
    
  • 2

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

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

    到目前为止,这是将使用bundler安装的gem卸载到供应商目录中的最简单方法 . 理想情况下,会有一个命令 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
    
  • 3

    如果您正在尝试重新安装rake, gem pristine rake 将失败 Skipped rake-10.X.X, it is a default gem 并且捆绑赢了't install it either, because it can' t卸载它 .

    如果你正在使用rvm,似乎最简单的就是做一个 rvm reinstall 2.x.x . 至少对我来说, rvm repair all 也没有帮助 .

    所有其他默认宝石也是如此 . 我会在这里列出它们,以便绝望的googlers找到一些帮助:

    • bigdecimal

    • 滴水

    • io-console

    • json

    • minitest

    • psych

    • rbtree

    • rdoc

    • 测试单位

  • 42

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

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

相关问题