如何在Gem安装时指定Gem依赖版本

时间:2017-04-23 18:37:47

标签: ruby rubygems bundler

我正在使用一个具有依赖关系的gem,其版本必须根据gem 安装时运行的Ruby版本而有所不同。具体来说,nio4r gem的当前版本需要Ruby版本> = 2.2.2,并且理想情况下需要async的{​​{1}} gem应该可以在任何Ruby版本上运行> = 2.0。

我尝试将一些代码放入gemspec文件中以改变版本,但它似乎是在gem 内置时执行,而不是在安装时执行。换句话说,基于用于构建gem的任何Ruby版本,nio4r版本被硬编码到gem中。这是我在gemspec中尝试的代码(nio4r是一个OS X命令,可以说出一个字符串,非常有助于了解发生了什么以及何时发生;我当然会在以后删除它。)

say

正如我所说,这是在gem # Recent versions of nio4r require a Ruby version >= 2.2.2. # If the version used is earlier, load an earlier version of nio4r. if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.2.2') `say Installing latest version of nio4r` spec.add_runtime_dependency "nio4r" else `say Installing nio4r version 1.2.1` spec.add_runtime_dependency "nio4r", '1.2.1' end 而不是build上执行的。我知道我可以使用install来做这种事情并将规范放在bundler中,但据我所知,当gem为{{1}时,将不会使用该文件}'编

如何在gem安装时获得依赖关系的gem版本?

我正在寻找一种自动化的解决方案,也就是说,不涉及此gem的用户的任何干预。此外,这个gem将由于安装另一个gem而安装,因此我不希望用户必须跟上其依赖gem的更改并且必须手动修改Gemfile。这有点违反了得墨忒耳法。

1 个答案:

答案 0 :(得分:0)

我不知道如何在gem的gemspec文件中动态更新ruby版本,但是你可以将它锁定到特定的ruby版本:

spec.required_ruby_version = '>= 2.2.2'

或者你可以向消费者推荐你的gem(也许在README中),如果他们使用2.2.2版本的ruby版本,他们必须强制使用特定版本的nio4r

在Gemfile中获取新的Ruby:

ruby "2.4.1"
gem "keiths_gem"

在带有旧版Ruby的Gemfile中:

ruby "2.1.0"
gem "keiths_gem"
gem "nio4r", '1.2.1'