我通过Gemfile使用bundler安装了所有宝石。我(错误地)认为如果我从我的Gemfile中删除了一个gem并运行'bundle install',那么将删除已删除的gem。我查看了捆绑器帮助文件,据我所知,它没有办法卸载宝石。
我只是使用gem uninstall x来做所有事情吗?这会混淆捆绑者吗?
答案 0 :(得分:132)
Bundler是从你的应用程序的根目录启动的,所以它确保所有需要的宝石都可以让你的应用程序正常工作。如果由于某种原因你不再需要宝石,你将不得不运行
gem uninstall gem_name
如上所述。所以每次运行bundler都会重新检查依赖项
编辑 - 2014年12月24日
我看到人们不断回答这个问题我决定添加一些东西。 我给出的答案就是你保持全球宝石的情况。考虑使用诸如rbenv或rvm之类的gem管理器来保存作用于特定项目的宝石集。
这意味着在全局级别不会安装任何gem,因此当您从项目的Gemfile中删除一个Gemfile并重新运行bundle时,它显然不会加载到您的项目中。然后,您可以运行bundle clean(使用项目目录),它将从系统中删除所有那些曾经从您的Gemfile(在同一目录中)安装的gem,但在此给定时间不再列在那里....长话短说 - 它删除了未使用的宝石。
答案 1 :(得分:96)
这将卸载由bundler安装的gem:
bundle exec gem uninstall GEM_NAME
请注意,这会抛出
错误:执行gem时...(NoMethodError)未定义方法`delete'for#< Bundler :: SpecSet:0x00000101142268>
但实际上已删除了宝石。下次运行bundle install
时,将重新安装gem。
答案 2 :(得分:21)
使用较新版本的bundler,您可以使用清洁任务:
$ bundle help clean
Usage:
bundle clean
Options:
[--dry-run=only print out changes, do not actually clean gems]
[--force=forces clean even if --path is not set]
[--no-color=Disable colorization in output]
-V, [--verbose=Enable verbose output mode]
Cleans up unused gems in your bundler directory
$ bundle clean --dry-run --force
Would have removed actionmailer (3.1.12)
Would have removed actionmailer (3.2.0.rc2)
Would have removed actionpack (3.1.12)
Would have removed actionpack (3.2.0.rc2)
Would have removed activemodel (3.1.12)
...
编辑:
如果您使用全局gemset(即 - 您的所有项目都将其宝石保存在同一位置),则不建议这样做。 但是,几乎没有办法让每个项目的宝石分开:
rvm
gemsets(http://rvm.io/gemsets/basics)bundle install
,并提供以下任一选项:--deployment
或--path=<path>
(http://bundler.io/v1.3/man/bundle-install.1.html)答案 3 :(得分:1)
您必须使用'gem uninstall gem_name'来卸载gem。
请注意,如果您在系统范围内安装了gem(即sudo bundle install),那么您可能需要使用-n选项指定二进制目录,以确保删除属于gem的二进制文件。例如
sudo gem uninstall gem_name -n /usr/lib/ruby/gems/1.9.1/bin
答案 4 :(得分:1)
我好像通过bundler手动删除unicorn gem(“sudo bundler exec gem uninstall unicorn”)来解决这个问题,然后重新绑定(“sudo bundle install”)。
不确定为什么会发生这种情况,尽管上述修复确实有效。
答案 5 :(得分:1)
如果你想清理所有宝石并重新开始
sudo gem clean
答案 6 :(得分:0)
捆绑器现在有一个bundle remove GEM_NAME
命令(自v1.17.0, 25 October 2018起)。