mygem.gemspec内にgitブランチの依存関係がある可能性はありますか?
私は次のようなことを考えています:
gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'
...しかしそれは機能しません。
回答:
これは不可能であり、Gem開発者がgemにアクセスするために特定のバージョン管理システムをインストールすることをユーザーに要求できるようにするのはRubyGemsにとってかなり手間がかかるため、おそらく決してそうなることはありません。ジェムは、最小限の数の依存関係で自己完結型である必要があります。これにより、人々はジェムを可能な限り幅広いアプリケーションで使用できるようになります。
独自の内部プロジェクトでこれを実行したい場合は、これを非常によくサポートするBundlerを使用することをお勧めします。
編集
コメント提供者によると、これはもはや真実ではありません。履歴コンテキストのために保持される事前情報。
Gemfileと.gemspecでgemへの参照を複製すると、Bundlerで警告メッセージが表示されるようになったため、この回答は正しくないように見えます。
古い情報
イェフダ・カッツによるこの記事は、私にとって同様の混乱を解消しました。開発でのみ使用する場合は、gitのものをgemfileに追加するのが最善であると書かれていますが、そのバンドラーはgemspecからの依存関係/バージョン情報を引き続き使用します(私には魔法のようですが、Yehudaを信頼しています)。
gemspec
、そこに配置すると、gemspecからも読み取ります。したがって、実行するとbundle install
、BundlerがGemfileで指定されたgemをインストールすることが発生すると思います(ただし、テストは行っていません)。Bundlerはすでにインストールしているので、require
gemリポジトリからのものではないという事実に関係なく、そのgemはgemで使用できます。魔法はありません。Bundlerは通常どおり機能します。
私もこの問題を理解しようとしていました。そして、私は次の解決策を思いついたところです(あなたがあなたの宝石を公開しているか、そのoauth2宝石を再配布する権利を持っているかどうかはわかりません)。
oauth2 gemを必要とするgemで、これを実行します。
git submodule add git@github.com:lgs/oauth2.git lib/oauth2
デフォルトとは異なるブランチが必要な場合
cd lib/oauth2 && git checkout <branchname_or_ref>
cd .. && git add lib/oauth2
git commit -m "adding outh2 submodule"
gemspecで、requireversion行の上にこれを追加します
$:.push File.expand_path('../lib/oauth2/lib', __FILE__)
また、oauth2gemの実行時の依存関係をすべてgemspecに追加する必要があります。私はまだこれを回避する方法を見つけていません。
これは私がやったことであり、私たちのgemはgitを介して必要とされるため、これがrubygemsで公開されたgemで機能するかどうかはわかりません。
gem 'my_gem', git: 'git@github.com:me/myrepo', submodules: true
場合、githubからインストールする場合は、ホストアプリケーションで:を使用する必要がある場合があり ます。
私は回避策をかなり簡単に見つけました:
プロジェクトに参加P
していて、tools
それ自体がOSgemを使用する自作のgemを使用したいとしますoauth2
。
内oauth2
でパッチを作成し、そのパッチをgemtools
で必要とする場合、受け入れられた回答に従って、gemでこの問題を修正することはできません。
ただし、プロジェクトP
のGemfile内で必要なバージョンを指定することができます。これはtools
、実行時に使用されるバージョンになります。
gem 'oauth2', github: 'lgs/oauth2'