【问题标题】:What is the best way to uninstall gems from a rails3 project?从 rails3 项目中卸载 gem 的最佳方法是什么?
【发布时间】:2011-06-07 17:14:33
【问题描述】:

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

我是否只对所有内容都使用 gem uninstall x ?这会混淆 bundler 吗?

【问题讨论】:

    标签: ruby-on-rails-3 uninstallation bundler


    【解决方案1】:

    Bundler 现在有一个bundle remove GEM_NAME 命令(从v1.17.0, 25 October 2018 开始)。

    【讨论】:

    • 此命令仅从 Gemfile 中删除 gem,不会从系统中卸载 gem。如果你也想卸载它,你会想运行bundle remove --install GEM_NAME
    【解决方案2】:

    这将卸载捆绑器安装的gem:

    bundle exec gem uninstall GEM_NAME
    

    请注意,这会抛出

    错误:在执行 gem ... (NoMethodError) 未定义方法 `delete' for #<:specset:0x00000101142268>

    但宝石实际上已被移除。下次运行 bundle install 时,gem 将被重新安装。

    【讨论】:

    • 对于 RVM 用户:如果您为特定项目设置了 gemset,则必须使用此方法。从项目文件夹中运行gem uninstall pg 将从您的全局/系统级gemset 中卸载pg,而不是bundler 的
    • 这是您指的错误吗? ERROR: While executing gem ... (NoMethodError) undefined method `delete' for #&lt;Bundler::SpecSet:0x00000101142268&gt;
    • +1 用于在捆绑上下文中执行此操作。希望它没有抛出那个错误!更好的是,希望我可以捆绑 -f 更新 gemname。
    • @EricHu 如果您使用的是 RVM gemset,则不会。每当您在 RVM gemset 中使用 gem install xxx 安装 gem 时,它都会保留在其中,因此在 RVM gemset 上执行普通 gem uninstall xxx 将删除安装在该 gemset 上的 gem,而不是系统中的 gem。
    • @EstebanFeldman 你说得对,我认为这是过去 11 个月对 RVM 所做的更改。
    【解决方案3】:

    如果你想清理所有的宝石并重新开始

    sudo gem clean
    

    【讨论】:

      【解决方案4】:

      Bundler 从您应用的根目录启动,因此它确保所有需要的 gem 都存在以使您的应用正常工作。如果由于某种原因您不再需要 gem,则必须运行

          gem uninstall gem_name 
      

      如上所述。因此,每次运行 bundler 时,它都会重新检查依赖项

      编辑 - 24.12.2014

      我看到人们不断提出这个问题,所以我决定补充一点。 我给出的答案是针对您在全球范围内维护宝石的情况。考虑使用 rbenv 或 rvm 之类的 gem 管理器来将 gem 集保持在特定项目的范围内。

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

      【讨论】:

        【解决方案5】:

        使用较新版本的 bundler,您可以使用 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 保存在同一个位置)。 但是,有几种方法可以将每个项目的 gem 分开:

        1. rvm gemsets (http://rvm.io/gemsets/basics)
        2. bundle install 具有以下任一选项:--deployment--path=&lt;path&gt; (http://bundler.io/v1.3/man/bundle-install.1.html)

        【讨论】:

        • 使用bundle clean --force 删除了一堆我在当前项目中不使用但在我的其他项目中使用的宝石。我应该设置路径吗?只是bundle clean 返回“只能在设置--path 或--force 时使用bundle clean”。但是--path 选项甚至没有出现在帮助中。
        • 没错@Dennis。如果您使用的是全局 gemset,clean 任务实际上没有意义。但是,如果您愿意,您的每个项目都可以将其 gem 分开。您可以通过 rvm gemsets (rvm.io/gemsets/basics) 执行此操作,也可以通过 bundle install (bundler.io/v1.3/man/bundle-install.1.html) 的 --path 选项指定 gems 的路径
        【解决方案6】:

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

        不知道为什么会这样,尽管上面的修复似乎确实有效。

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-04-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-02
            • 2012-06-25
            相关资源
            最近更新 更多