rails3プロジェクトからgemをアンインストールする最良の方法は何ですか?


102

Gemfileからbundlerを使用してすべてのgemをインストールしました。(間違い)Gemfileからgemを削除して「バンドルインストール」を実行すると、削除されたgemはアンインストールされると考えました。バンドラーのヘルプファイルを確認しましたが、知る限り、gemをアンインストールする方法がありません。

すべてに対してgem uninstall xを使用するだけですか?これはバンドラーを混乱させるでしょうか?

回答:


136

Bundlerはアプリのルートディレクトリから起動されるため、アプリを動作させるために必要なすべてのGemが存在することを確認します。何らかの理由でGemが不要になった場合は、実行する必要があります

    gem uninstall gem_name 

上で述べたように、バンドルを実行するたびに依存関係が再チェックされます

編集-24.12.2014

私は人々がこの質問に来続けていることがわかります私は少し何かを追加することにしました。私が出した答えは、あなたがあなたの宝石をグローバルに維持する場合のためのものでした。rbenvやrvmなどのgemマネージャーを使用して、gemのセットを特定のプロジェクトにスコープ設定しておくことを検討してください。

つまり、gemはグローバルレベルでインストールされないため、プロジェクトのGemfileからgemを削除してバンドルを再実行すると、明らかに、プロジェクトにロードされません。次に、(プロジェクトdirを使用して)bundle cleanを実行すると、Gemfileから(同じディレクトリに)一度インストールされたすべてのgemがシステムから削除されますが、この時点ではリストに表示されなくなります。短い話-未使用の宝石を削除します。


98

これにより、バンドラーによってインストールされたgemがアンインストールされます。

bundle exec gem uninstall GEM_NAME

これがスローすることに注意してください

エラー:gemの実行中...(NoMethodError)#<Bundler :: SpecSet:0x00000101142268>の未定義のメソッド `delete '

しかし、宝石は実際に削除されます。次回bundle install、gem を実行すると再インストールされます。


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 update gemnameをバンドルできることです。
2012

2
RVM gemsetを使用している場合は@EricHuは使用できません。RVM gemset内でgem install xxxを使用してgemをインストールすると、それが残っているため、RVM gemsetで単純なgem uninstall xxxを実行すると、システムgemsetではなく、そのgemsetにインストールされているgemが削除されます。
Esteban Feldman

@EstebanFeldmanそうですね、これは過去11か月にRVMに加えられた変更だと思います。
Eric Hu

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を使用している場合(つまり、すべてのプロジェクトがgemを同じ場所に保持している場合)、これはお勧めできません。ただし、各プロジェクトのgemを個別に保つ方法はいくつかあります。

  1. rvmgemsets(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
Evgeniaマノロバ2014年

1

gemをアンインストールするには、「gem uninstall gem_name」を使用する必要があります。

gemをシステム全体にインストールした場合(つまり、sudo bundle install)、-nオプションを使用してバイナリディレクトリを指定し、gemに属するバイナリが確実に削除されるようにする必要がある場合があります。例えば

sudo gem uninstall gem_name  -n /usr/lib/ruby/gems/1.9.1/bin

1

バンドルを介してユニコーンのgemを手動で削除し(「sudo bundler exec gem uninstall unicorn」)、再バンドル(「sudo bundle install」)することでこれを解決したようです。

上記の修正は機能するようですが、なぜそれが起こったのかはわかりません。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.