Ruby Gemspecの依存関係:gitブランチの依存関係を持つことは可能ですか?


82

mygem.gemspec内にgitブランチの依存関係がある可能性はありますか?

私は次のようなことを考えています:

gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'

...しかしそれは機能しません。


git依存関係ではなく、パス依存関係が必要なことを除いて、これと同じ問題があります。どういうわけかこれを回避する方法はありませんか?たぶん、gemspecのどこかにハックなRubyコードを貼り付けることによって?
ajedi32 2014年

回答:


44

これは不可能であり、Gem開発者がgemにアクセスするために特定のバージョン管理システムをインストールすることをユーザーに要求できるようにするのはRubyGemsにとってかなり手間がかかるため、おそらく決してそうなることはありません。ジェムは、最小限の数の依存関係で自己完結型である必要があります。これにより、人々はジェムを可能な限り幅広いアプリケーションで使用できるようになります。

独自の内部プロジェクトでこれを実行したい場合は、これを非常によくサポートするBundlerを使用することをお勧めします。


22
...はい、しかしどうすればそれを行うことができますか?
Luca G. Soave 2011年

33
しかし、あなたのgemが後で別のgem(foobar_gemなど)に含まれる場合はどうなりますか?foob​​ar_gemがgemの依存関係を解決したい場合、gemspecファイルで排他的に表示されませんか?
eremzeit 2012年

7
私がまったく同じ問題を抱えているこれに対する解決策を見つけたことがありますか?
msaspence 2013

14
@ eremzeit&msaspence-賛成票が非常に多いので、私は返答せざるを得ないと感じています。あなたがそれを間違っているので、これに対する解決策はありませ。Bundlerを使用する単一のアプリケーションのgitリポジトリに依存することは問題ありません。リリースされたgemがGitHubまたはその他のソースコードリポジトリに依存することは完全に間違っています。gemをリリースする場合は、そのすべての依存関係もgemとしてリリースする必要があります。gemなどの正式なパッケージをリリースされていないソースコードに依存させることは、カートを馬の前に置くことです。 これを行おうとしないでください
gtd 2014

23
@gtdgemの作成とrubygemsでのgemのリリースは2つの別々のことです。未公開のプライベートgemに独自のプライベート依存関係がある可能性があります。それは私には問題ないようです。RubyGemsはこのユースケースに対応していないようですが、これが間違っているとは思いません。それをサポートすることはあまりありません。私が間違っている?
スティーブンクロスビー

13

編集

コメント提供者によると、これはもはや真実ではありません。履歴コンテキストのために保持される事前情報。

Gemfileと.gemspecでgemへの参照を複製すると、Bundlerで警告メッセージが表示されるようになったため、この回答は正しくないように見えます。

古い情報

イェフダ・カッツによるこの記事は、私にとって同様の混乱を解消しました。開発でのみ使用する場合は、gitのものをgemfileに追加するのが最善であると書かれていますが、そのバンドラーはgemspecからの依存関係/バージョン情報を引き続き使用します(私には魔法のようですが、Yehudaを信頼しています)。


3
何がそんなに魔法なの?BundlerはGemfileからのみ読み取ります。ただしgemspec、そこに配置すると、gemspecからも読み取ります。したがって、実行するとbundle install、BundlerがGemfileで指定されたgemをインストールすることが発生すると思います(ただし、テストは行っていません)。Bundlerはすでにインストールしているので、requiregemリポジトリからのものではないという事実に関係なく、そのgemはgemで使用できます。魔法はありません。Bundlerは通常どおり機能します。
Marnen Laibow-Koser 2014

2
Gemfileと.gemspecでgemへの参照を複製すると、Bundlerで警告メッセージが表示されるようになったため、この回答はもはや真実ではないように見えます...
Andy Jones

7

私もこの問題を理解しようとしていました。そして、私は次の解決策を思いついたところです(あなたがあなたの宝石を公開しているか、その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を作成し、両方が活発に開発されている場合は、依存関係をサブモジュールとして追加することが正しい解決策です。
ベンジニア2016

重要なのは、これを行うgem 'my_gem', git: 'git@github.com:me/myrepo', submodules: true場合、githubからインストールする場合は、ホストアプリケーションで:を使用する必要がある場合があり ます。
ジョーエドガー

1

私は回避策をかなり簡単に見つけました:

プロジェクトに参加Pしていて、toolsそれ自体がOSgemを使用する自作のgemを使用したいとしますoauth2

oauth2でパッチを作成し、そのパッチをgemtoolsで必要とする場合、受け入れられた回答に従って、gemでこの問題を修正することはできません。

ただし、プロジェクトPのGemfile内で必要なバージョンを指定することができます。これはtools、実行時に使用されるバージョンになります。

gem 'oauth2', github: 'lgs/oauth2'

これが私の実例です。

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