4

私のウィンドウ ( rmagick) で gem が更新されないようにしたいので、 に固執し2.12.0 mswin32ます。それでも、私の同僚はダーウィンのインストールにgemを持っている必要があります...

だから、私はでこのようなことをしようとしましたGemfile:

if RUBY_PLATFORM =~ /darwin/i
  gem 'rmagick', '~> 2.12.0'
else
  gem 'rmagick', '=2.12.0.mswin32'
end

しかしbundle install苦情。

これを適切に処理する正しい方法は何ですか?

4

2 に答える 2

1

gemspec は実行可能コードを含まない YAML にシリアル化されるため、gemspec で条件を使用することはできません。

Gemfileローカルの Rails プロジェクト (gem ではない) で関連する問題に直面しました。

現在、Gemfile には以下が含まれています。

group :test do
...
# on Mac os X
  gem 'rb-fsevent' if RUBY_PLATFORM.include?("x86_64-darwin")
  gem 'ruby_gntp' if RUBY_PLATFORM.include?("x86_64-darwin")

# on Linux
  gem 'rb-inotify' unless RUBY_PLATFORM.include?("x86_64-darwin")
  gem 'libnotify' unless RUBY_PLATFORM.include?("x86_64-darwin")
end

これは、Mac および Linux システムでの開発では (醜いですが) 機能します。

Gemfile.lockただし、異なるプラットフォームの開発者がコードをチェックインするたびに変更されるため、チェックインを停止しました。

そのため、マルチプラットフォームの Gemfile のソリューションは の問題も解決するはずですGemfile.lock

他のソリューションでは、ターゲット OS ごとに複数の.gemspec ファイルを作成し、各プラットフォームのプラットフォームと依存関係の両方を変更します。

gemspec = Gem::Specification.new do |s|
  s.platform = Gem::Platform::RUBY
end

# here build the normal gem

# Now for linux:
gemspec.platform = "linux"
gemspec.add_dependency ...

# build the newer gemspec
...
于 2013-02-12T10:12:45.520 に答える
1

Bundler が提供するプラットフォームオプションを使用する必要があります。

gem を特定のプラットフォームまたは一連のプラットフォームでのみ使用する必要がある場合は、それらを指定できます。プラットフォームは基本的にグループと同じですが、他のプラットフォームの gem のグループを除外するために --without install-time フラグを使用する必要はありません。

したがって、特定のケースでは、次のようになります。

gem 'rmagick', '~> 2.12.0', :platforms => :ruby
gem 'rmagick', '=2.12.0.mswin32', :platforms => :mswin
于 2013-02-12T13:20:23.210 に答える