Gemfileでローカルgemを指定するにはどうすればよいですか?


回答:


541

私はあなたがこれを行うことができると信じています:

gem "foo", path: "/path/to/foo"

10
ハードコードされたパスは、迅速なハックセッションには問題ありませんが、Bloudermilkのローカルgemソリューションは、バージョン管理下のプロジェクトにはより効果的です。他の人がgemソースをチェックアウトしたり、同じパスを共有したりする必要がないように、gemとgemを使用するプロジェクトの両方のプロジェクトをチェックインし続けることができます。
mahemoff 14年

4
プロジェクトディレクトリのローカルgemへの.gitignoredシンボリックリンクを使用して、これを少しクリーンにすることができます。これにより、両方のプロジェクトでソース管理を個別に使用でき、他のプロジェクトは同じディレクトリ構造を持たなくても同じことができます。
Dan

7
気をつけるべきことは春かもしれません。gemにローカルパスを使用している場合、私がrails consoleで行ったように、ローカルgemのキャッシュバージョンに気付くでしょう。ローカルのgemの変更が反映されていないようspring stopに見える場合は、本当に問題かどうかを確認してください。
Jason R

1
ローカルgemパスをconfig / spring.rbに追加すると、rails console / serverを再起動した後にローカルgemの変更をピックアップするのに役立つようです。
Jason R

5
:ここでこれを行う方法のより良い方法rossta.net/blog/...
Cyzanfar

230

パスを指定するだけでなく(ジミーが述べたように)、次の構成オプションを使用することによってのみ、Bundlerに環境のローカルgemを使用させることもできます。

$ bundle config local.GEM_NAME /path/to/local/git/repository

これは、2つのGem、またはGemとRailsアプリを並べて開発する場合に非常に役立ちます。

ただし、これは依存関係にすでにgitを使用している場合にのみ機能することに注意してください。次に例を示します。

# In Gemfile
gem 'rack', :github => 'rack/rack', :branch => 'master'

# In your terminal
$ bundle config local.rack ~/Work/git/rack

ドキュメントに見られるように。


私はBUNDLE_PATH(配布用のパッケージのビルド)を使用しているため、これに問題があります。あなたが提案したこと、またはジミーの答えをするとき、それはを行うだけでusing、実際には私のBUNDLE_PATHフォルダにインストールされません。私はこれを理解することができませんでした、助けはありますか?
Automatico、

2
これは、ここでの議論に従ってgemspecでは機能しないことに注意してください。
davetapley 2014

31
ローカルオーバーライドを無効にするには:bundle config --delete local.GEM_NAME
alxndr 2014年

これを機能させるには、gem行からversionディレクティブを削除する必要がありました。
Epigene

4
プロダクションとは異なる開発ブランチを使用する場合は、設定する必要があります。そうしないとbundle config disable_local_branch_check true、Bundlerがブランチについて文句を言います。ただし、チェックはに入る不正なコミットを停止することになっているため、これには注意してくださいGemfile.lock。ここにドキュメント:bundler.io/v1.12/git.html
Leo

33

作業している場合は、gitでローカルgemを参照することもできます。

gem 'foo',
  :git => '/Path/to/local/git/repo',
  :branch => 'my-feature-branch'

次に、それが変更された場合、私は実行します

bundle exec gem uninstall foo
bundle update foo

しかし、誰もがこれらの2つのステップを実行する必要があるかどうかはわかりません。


5
これはすばらしいですが、gemを積極的に開発している場合はそれほど便利ではありません...すべての変更をコミットする必要があるため&&bundle uninstall <gem> && bundle install 、すべての変更をアプリに反映するには
Ramses

18

Railsプロジェクトでローカルgemリポジトリを使用するには、以下の手順に従います。

  1. gemフォルダーがgitリポジトリーであるかどうかを確認します(コマンドはgemフォルダーで実行されます)

    git rev-parse --is-inside-work-tree
  2. リポジトリパスの取得(コマンドはgemフォルダーで実行されます)

    git rev-parse --show-toplevel
  3. Railsアプリケーションのローカルオーバーライドの設定

    bundle config local.GEM_NAME /path/to/local/git/repository

    GEM_NAMEあなたの宝石の名前はどこですか/path/to/local/git/repositoryで、コマンドの出力はポイントです2

  4. アプリケーションGemfileに次の行を追加します。

    gem 'GEM_NAME', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'
  5. 実行bundle installすると、次のようになります。

    Using GEM_NAME (0.0.1) from git://github.com/GEM_NAME/GEM_NAME.git (at /path/to/local/git/repository) 

    GEM_NAMEあなたの宝石の名前はどこ/path/to/local/git/repositoryからですか2

  6. 最後にbundle listnot not gem listを実行すると、次のようになります。

    GEM_NAME (0.0.1 5a68b88)

    GEM_NAMEあなたの宝石の名前はどこですか


私が観察しているいくつかの重要なケース:

Rails 4.0.2  
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux] 
Ubuntu 13.10  
RubyMine 6.0.3
  • RubyMineローカルライブラリを外部ライブラリとして表示していないようです。バグの詳細については、 こちらこちらをご覧ください。
  • ローカルの宝石で何かを変更しているとき、railsアプリケーションにロードするために、 stop/start、railsサーバーを使用するあります
  • versiongemを変更するとstopping/starting、Railsサーバーからエラーが返されます。それを修正するために、私はGemfileこのようにRailsアプリケーションでgemバージョンを指定しています:

    gem 'GEM_NAME', '0.0.2', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'


-4

ブランチも必要な場合:

gem 'foo', path: "point/to/your/path", branch: "branch-name"

動作しません。これは、エラーを生成します Only gems with a git source can specify a branch.
のKeNB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.