私は、宝石のインストール時に条件付きで依存関係を設定する必要がある宝石に取り組んでいます。私はいくつかの掘り下げを行ったルビーの宝石を構築し、依存関係を条件付きで指定する
と私はこの必要性で一人ではないようだ。
Rubygems: How do I add platform-specific dependency?
これは、長いスレッド
http://www.ruby-forum.com/topic/957999
である私が宝石に依存関係を追加するために見ることができる唯一の方法は、中に宝石:: Specifictionブロック内add_dependencyメソッドを使用することです。 gemspecファイル
Gem::Specification.new do |s|
# ... standard setup stuff
# conditionally set dependencies
s.add_dependency "rb-inotify", "~> 0.8.8" if RUBY_PLATFORM =~ /linux/i
s.add_dependency "rb-fsevent", "~> 0.4.3.1" if RUBY_PLATFORM =~ /darwin/i
s.add_dependency "rb-fchange", "~> 0.0.5" if RUBY_PLATFORM =~ /mswin|mingw/i
end
ネット上で見つかったすべてのドキュメントとスレッドに基づいて、トンあなたは
- Linux上の宝石をインストールした場合、その後、RB-inotifyのは、依存関係および自動インストール
- だろうマック - RB-fseventがインストールされる
- のWindows - RB-fchangeがインストールされます
しかし、それはそうではないようです。ブロック内のif文は、gemがビルドされてパッケージ化された時点で評価されます。したがって、 Linux上でgemをビルドしてパッケージ化すると、rb-inotifyが依存関係Macとして追加され、次にrb-fsevent、Windows-rb-fchangeとして追加されます。
解決策がまだ必要な場合は、私はrubygemsコードで掘り下げました。次のようなことが起こるのは広範な話です。
- ビルドあなたの宝石のためのすべてのコード:foo.gem
- はfoo.gemspecファイル
- ビルド、パッケージを作成し、そのようなrubygems.org
- として宝石サーバーに宝石をリリース皆さんに知らせてください。
- gem install foo
- foo.gemファイルがダウンロード、展開、インストールされています。すべての依存関係もインストールされます。
- すべてを設定する必要があります。宝石を使用して缶詰めできます。
宝石が構築され、解放されたときにfoo.gemspecファイルがロードされ、宝石::仕様ブロックが評価され、YAMLに変換され、 metadata.gzとして圧縮、およびfoo.gemに含まれているようです。ルビコードはdata.tar.gzに圧縮され、同様にインクルードされます。 gemがローカルの開発者マシンにインストールされると、 YAMLはmetadata.gzから抽出され、Gem :: Specificationブロックに変換されますが、元のブロックには戻されません。
Gem::Specification.new do |s|
if s.respond_to? :specification_version then
s.specification_version = 3
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
s.add_runtime_dependency(%q<rb-inotify>, ["~> 0.8.8"])
else
s.add_dependency(%q<rb-inotify>, ["~> 0.8.8"])
end
else
s.add_dependency(%q<rb-inotify>, ["~> 0.8.8"])
end
end
OK:
代わりに、次のようなものが表示されます。しかし、私はプロセスの鳥瞰図を持っていますが、単一の宝石を構築し、OSターゲットの範囲に対する依存関係を条件付きで指定するという私の望みは変わりません。
ターゲットOSごとに複数の.gemspecファイルを作成する以外の方法がある人は...私はすべて耳にします!
私の答えを見てくださいhttp://stackoverflow.com/a/10249133/309514、それはうまく動作します。 – Fotios