如何使用捆绑器重新安装 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 install
或bundle 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 --L
,gem 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 c
或rails 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 uninstall
或bundle 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的主要内容,如果未能解决你的问题,请参考以下文章