什么是从一个rails3项目卸载gem的最佳方式是什么?

我使用捆绑器通过Gemfile安装了所有的gem。 我想(错误地),如果我从我的Gemfile中删除了一个gem,并运行“捆绑安装”,删除的gem将被卸载。 我已经看了捆绑器的帮助文件,据我所知,它没有办法卸载gem。

我只是使用gem卸载x的一切? 这会混淆捆绑商吗?

Bundler是从您的应用程序的根目录启动的,所以它确保所有需要的gem出现,让您的应用程序working.If由于某种原因,你不再需要一个gem,你将不得不运行

gem uninstall gem_name 

如上所述。因此,每次运行捆绑器时,都会重新检查依赖关系

编辑 – 24.12.2014

我看到人们不断提出这个问题,我决定添加一些东西。 我给出的答案是,当你保持你的gem全球。 考虑使用诸如rbenv或rvm之类的gempipe理器来将gems集合保留在特定项目的范围内。

这意味着没有gem会被安装在全局级别,所以当你从你的项目的Gemfile中删除一个,然后重新运行包,那么它显然不会被加载到你的项目中。 然后,你可以运行bundle clean(与项目目录),它会从系统中删除所有那些曾经从你的Gemfile(在同一目录中)安装的gem,但在这个给定的时间不再列在那里….长话短说 – 它删除未使用的gem。

这将卸载由bundler安装的gem:

 bundle exec gem uninstall GEM_NAME 

请注意,这将抛出

ERROR: While executing gem ... (NoMethodError) undefined method `delete' for #<Bundler::SpecSet:0x00000101142268>

但gem实际上被删除。 下一次运行bundle install ,gem将被重新安装。

使用更新版本的捆绑器,您可以使用干净的任务:

 $ 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保存在同一个地方)。 但是,保持每个项目的gem分离的方法很less:

  1. rvm gemsets( http://rvm.io/gemsets/basics
  2. 使用以下任一选项进行bundle install--deployment --path=<path>--path=<path>http://bundler.io/v1.3/man/bundle-install.1.html

您必须使用“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 

如果你想清理所有的gem,并重新开始

 sudo gem clean 

我似乎通过手动删除麒麟gem(“sudo bundler exec gem uninstall unicorn”),然后重新绑定(“sudo bundle install”)来解决这个问题。

不知道为什么发生虽然上述修复似乎工作。