我正在使用一个具有依赖关系的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。这有点违反了得墨忒耳法。
答案 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'