2017-04-23 58 views
0

我正在使用具有依赖项的Gem,其版本必须因安装了的时根据运行的Ruby版本而异。具体而言,当前版本的nio4r gem需要Ruby版本> = 2.2.2,而需要nio4rasync gem理想情况下应该能够在任何Ruby版本> = 2.0的条件下运行。如何在Gem安装时指定Gem依赖版本

我试图把一些代码到gemspec文件变化的版本,但它似乎是,当创业板,而不是当它是安装执行它。换句话说,nio4r版本根据用于构建gem的任何版本的Ruby来硬编码到gem中。这里是我在gemspec中尝试的代码(say是一个OS X命令,用于说出一个字符串,并且对知道发生了什么以及什么时候非常有帮助;稍后我会将其删除)。

# 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这种东西,并把规范放在Gemfile,但据我所知,该文件将不会被使用,当宝石是gem install'编辑。

我怎样才能获得依赖的宝石版本在宝石安装时变化?

我正在寻找一个自动化的解决方案,也就是说,不涉及任何这个宝石的用户干预。另外,由于安装了另一个gem,该gem将被安装,所以我不希望用户必须跟上对其依赖gem的更改,并且必须手动修改Gemfile。这可能会违反德米特法。

回答

0

没有办法,我知道的动态更新创业板的gemspec文件红宝石版本,但是你可以将其锁定到特定的红宝石版本:

spec.required_ruby_version = '>= 2.2.2' 

或者你可以建议消费者你的宝石(也许在自述文件中),如果他们使用2.2.2版本的ruby版本,他们必须强制使用nio4r的特定版本。

在Gemfile中的一个新的Ruby:

ruby "2.4.1" 
gem "keiths_gem" 

在Gemfile中使用旧版本的Ruby:

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

谢谢,但我要找的是自动化的解决方案,那就是,不涉及此宝石用户的任何干预。另外,由于安装了另一个gem,该gem将被安装,所以我不希望用户必须跟上对其依赖gem的更改,并且必须手动修改Gemfile。这可能会违反德米特法。我应该提到的是,我现在就要这样做。 –