宝石要求的条件

时间:2013-02-12 09:35:27

标签: ruby-on-rails gemfile

我想阻止在我的Windows(rmagick)上更新gem,因此它会粘在2.12.0 mswin32上。不过,我的同事需要在他的达尔文装置上安装宝石......

所以,我尝试在Gemfile

中做这样的事情
if RUBY_PLATFORM =~ /darwin/i
  gem 'rmagick', '~> 2.12.0'
else
  gem 'rmagick', '=2.12.0.mswin32'
end

bundle install投诉。

正确处理此问题的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

您无法在gemspec上使用条件,因为gemspec已序列化 进入YAML,它不包含可执行代码。

我遇到了本地Rails项目的Gemfile中的相关问题(不是 宝石)。

目前,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,因为它每次都会更改 具有不同平台的开发人员检查代码。

因此,多平台Gemfiles的解决方案也应该解决问题 问题Gemfile.lock

其他解决方案是为每个目标操作系统构建多个 .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
...

答案 1 :(得分:1)

您应该使用Bundler提供的platforms(滚动到平台部分)选项:

  

如果gem只能用于特定平台或一组   平台,您可以指定它们。平台基本相同   到组,除了你不需要使用--without   安装时标志,用于排除其他平台的宝石组。

所以在你的特定情况下,看起来像这样:

gem 'rmagick', '~> 2.12.0', :platforms => :ruby
gem 'rmagick', '=2.12.0.mswin32', :platforms => :mswin