如何使用捆绑器重新安装 gem

Posted

技术标签:

【中文标题】如何使用捆绑器重新安装 gem【英文标题】:How to reinstall a gem using bundler 【发布时间】:2012-08-24 16:57:36 【问题描述】:

我做了一个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

【问题讨论】:

如果你删除 Gemfile.lock 并再次运行 bundle install 会发生什么? @DVG 你应该那样做。 lock文件只指定了应该安装哪些版本,与是否安装gem没有任何关系。 没关系,看起来他已经尝试过了。 @DVG 我在您的帖子之后尝试过。抱歉,安德鲁·马歇尔,没那么快:( 如果你gem uninstall acts_as_taggable_on,然后再运行bundle install呢? 【参考方案1】:

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

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 没有任何问题。

【讨论】:

我也有类似的问题,但是有问题的 gem 是 使用bundle 命令安装的,并且在输出中根本不存在gem q --L。它仅由bundle list 列出,但裸露的gem 命令无法“看到”它,因此无法卸载/重新安装它。 gem uninstall gem-in-question 完成时没有错误(或任何输出),但对 bundle list 的内容没有影响,随后的 bundle install 只是说“你的包是完整的!”。现在该怎么办? 好吧,我不知道。您可以在列出之前运行bundle update,虽然我不知道它是否会修复。 你试过bundle exec gem uninstall the-gem-in-question吗?我知道gem list 会显示所有版本,但bundle exec gem list 会显示特定于捆绑包的那些宝石。 Szczepan - 我遇到了同样的问题。我从 Gemfile.lock 中删除了我的 gem,但没有这样做。然后,我在 .rvm/gems 下查找我的 gem 名称并删除了所有实例 - 它位于一些捆绑程序缓存目录中。随后,运行“捆绑安装”重新安装了 gem。 HTH。【参考方案2】:

如果使用 rbenv,这将让您完全卸载并重新安装诸如 rmagick 之类的 gem:

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

gem uninstall rmagick
bundle install

如果这不起作用,您可以删除已安装 gem 的所有痕迹。找到您的 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 的规范缓存:

rm $BUNDLE_DIR/specifications/rmagick*gemspec

然后你可以重新安装:

bundle install

【讨论】:

我想补充一点,您可能也必须删除创建的二进制文件,这就是我使用 charlock_holmes gem 的情况。我还必须删除以下路径才能完全重建:vendor/bundle/ruby/2.0.0/extensions/x86_64-linux/2.0.0/charlock_holmes-0.6.9.4/ 这与@lfxgroove 的提示一起对我有用。在我的基于 bundler-and-capistrano 的安装中,相关层次结构不在 vendor/ 之下,而是在 shared/bundle/ruby 等之下。 使用 gemfile 执行此操作时,您需要在没有 Gemfile 中的 gem 的情况下进行捆绑安装(已注释掉)以将其从 gemfile.lock 中删除,然后将其添加回来(取消注释)以便它重新安装【参考方案3】:

您可以随时使用:

gem pristine acts-as-taggable-on

原始 - 从 gem 缓存中的文件恢复已安装的 gem 到原始状态

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

bundle exec gem pristine acts-as-taggable-on

【讨论】:

我每次用EDITOR=vim bundle open my-gem搞砸调试时都会使用它 这应该是公认的答案,因为它符合 OP 的要求【参考方案4】:

如果在~/.rvm/ 中将RVM 与gem 一起使用,则如果bundle 没有重新安装gem,则此方法有效。

首先,删除gem源:

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】:

从终端的项目目录

gem uninstall gem_name 

【讨论】:

迄今为止最好的答案。刚刚bundle install【参考方案6】:

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

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

所有其他默认 gem 可能也是如此。我将在这里列出它们,以便绝望的谷歌人找到一些帮助:

大十进制 滴滴 io 控制台 json 迷你测试 心理 耙子 rbtree rdoc 测试单元

【讨论】:

【参考方案7】:

如果你已经安装到./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

【讨论】:

您正在寻找的 bundle uninstall <gemname> 等效命令是 bundle exec gem uninstall <gemname> Cheers ***.com/a/48094089/380607【参考方案8】:

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

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

【讨论】:

以上是关于如何使用捆绑器重新安装 gem的主要内容,如果未能解决你的问题,请参考以下文章

Sling 脚本助手返回空服务

域名重定向修复,IE浏览器也不能正常打开

阿里云ecs服务器重装系统教程

如何使用 Bundler 添加 gem

戴尔服务器重装系统的方法

如何在升级过程中运行捆绑包时,如何在WIX(Windows安装程序xml)引导程序项目中将按钮文本更改为“升级”?