【问题标题】:Conditions on gem requirement宝石要求条件
【发布时间】:2013-02-12 09:35:26
【问题描述】:

我想阻止更新我的 Windows (rmagick) 上的 gem,所以它坚持2.12.0 mswin32。不过,我的同事需要在他的 Darwin 安装中安装 gem...

所以,我尝试在Gemfile 中做这样的事情:

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

但是bundle install 投诉。

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

【问题讨论】:

    标签: ruby-on-rails gemfile


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

    所以,多平台 Gemfile 的解决方案也应该解决 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
    ...
    

    【讨论】:

    • 我尝试了第一个选项,但是当您尝试在每种情况下指定的 gem 是具有不同版本要求的相同 gem 时,它不起作用。 bundle install 是这样说的:你不能指定一个 gem 两次。或者至少我不知道如何正确语法(欢迎输入)。我会试试你的第二版,我会尽快回复你,谢谢你的回答。
    • 我遇到的部分问题是指定版本号。 gem list 说我有 rmagick 2.12.0 mswin32。现在,您不能在 Gemfile 内的 gem 版本规范中添加空格,所以我尝试了 "=2.12.0.mswin32"bundle install 与 gem 列表中的内容不匹配,因为它理解为两个不同的东西。非常感谢这里的任何输入。
    • 我真的不知道,但我做了类似的方法,它奏效了。我认为这可能会对您有所帮助-groups.google.com/forum/?fromgroups=#!topic/ruby-bundler/… AND forum.redminebacklogs.net/…
    【解决方案2】:

    您应该使用 Bundler 提供的 platforms 选项:

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

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

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

    【讨论】:

    • 我试过你的解决方案:它导致bundle install You cannot specify the same gem twice with different version requirements. You specified: rmagick (>= 0) and rmagick (= 2.12.0.mswin32)
    • 很遗憾,当您使用原始问题中的代码时,Bundler 会抱怨什么?
    • 看看我之前的评论就知道了。
    • 不,我的意思是当您拥有与原始问题中完全相同的 Gemfile 时,Bundler 会抱怨什么。使用 RUBY_PLATFORM。
    猜你喜欢
    • 2013-01-22
    • 2017-04-18
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 2017-07-04
    • 2019-02-19
    • 2011-02-12
    相关资源
    最近更新 更多