从rails3项目中卸载gem的最佳方法是什么?


102

我通过Gemfile使用捆绑程序安装了所有宝石。我以为(错误地)认为,如果我从Gemfile中删除了一个gem并运行了“ bundle install”,则将删除已删除的gem。我查看了捆绑程序帮助文件,据我所知,它没有卸载gems的方法。

我是否只对所有应用都使用gem uninstall x?这会混淆捆绑器吗?

Answers:


136

Bundler是从应用程序的根目录启动的,因此可以确保存在所有必需的gem才能使应用程序正常运行。如果由于某种原因不再需要gem,则必须运行

    gem uninstall gem_name 

如上所述,因此,每次运行捆绑程序时,它都会重新检查依赖项

编辑-2014年12月24日

我看到人们不断提出这个问题,所以我决定添加一些内容。我给出的答案是在全球范围内维护宝石的情况。考虑使用诸如rbenv或rvm之类的gem管理器,以使gem组的范围限定于特定项目。

这意味着不会在全局级别上安装任何gem,因此,当您从项目的Gemfile中删除一个gem并重新运行bundle时,显然不会将其加载到项目中。然后,您可以运行bundle clean(使用项目目录),它将从系统中删除曾经从Gemfile(位于同一目录中)安装的所有那些gem,但此时不再在其中列出。长话短说-去除未使用的宝石。


98

这将卸载捆绑程序安装的gem:

bundle exec gem uninstall GEM_NAME

请注意,这会抛出

错误:执行gem时...(NoMethodError)#<Bundler :: SpecSet:0x00000101142268>的未定义方法`delete'

但实际上已删除了该宝石。下次您运行bundle installgem时,将重新安装它。


10
对于RVM用户:如果已为特定项目设置了gemset,则必须使用此方法。gem uninstall pg从项目文件夹运行将从全局/系统级别的gemset而不是捆绑程序中卸载pg
Eric Hu

这是您所指的错误吗?ERROR: While executing gem ... (NoMethodError) undefined method `delete' for #<Bundler::SpecSet:0x00000101142268>
user664833

+1,用于在捆绑销售环境中进行。希望它不会引发该错误!更好的是,希望我可以捆绑-f更新gemname。
pduey 2012年

2
@EricHu,如果您使用的是RVM gemset,则不会。每当在RVM宝石集内安装带有gem install xxx的宝石时,它都会存在,因此在RVM宝石集上执行普通的gem卸载xxx会删除该宝石集而不是系统集上的宝石。
Esteban Feldman

@EstebanFeldman,您是对的,我认为这是过去11个月中对RVM所做的更改。
艾瑞克·胡

21

使用较新版本的捆绑程序,您可以使用clean任务:

$ 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,则不建议这样做(即,所有项目都将其gem放在同一位置)。但是,几乎没有什么方法可以使每个项目的宝石保持独立:

  1. rvm宝石集(http://rvm.io/gemsets/basics
  2. bundle install具有以下任一选项:--deployment--path=<path>((http://bundler.io/v1.3/man/bundle-install.1.html

使用bundle clean --force删除了一堆我在当前项目中不使用但在其他项目中使用的宝石。我应该设定一条路吗?只是bundle clean返回“仅在设置--path或--force时才能使用捆绑包清理”。但是该--path选项甚至没有出现在帮助中。
丹尼斯

1
没错,@ Dennis。clean如果您正在使用全局gemset,则该任务实际上没有任何意义。但是,如果您愿意,您的每个项目都可以有各自的特色。你可以这样做,或者通过RVM gemsets(rvm.io/gemsets/basics),或者通过指定的宝石路径--path的选项bundle installbundler.io/v1.3/man/bundle-install.1.html
叶夫根马诺洛娃

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

1

我似乎可以通过捆绑程序(“ sudo bundler exec gemuninstall unicorn”)手动删除unicorn gem,然后重新打包(“ sudo bundle install”)来解决此问题。

虽然上面的修复程序似乎起作用了,但是不确定为什么会发生。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.