解析gemspec之前,如何安装gem(通过使用gemspec的捆绑程序)?

时间:2018-07-27 19:12:15

标签: ruby rubygems

我有一个可以帮助版本控制的宝石。在gemspec文件中定义版本时,使此gem可用非常有用。

但是,问题在于,运行bundle install首先会导致gemspec解析,这会导致错误,因为尚未安装所需的gem。

我可以通过在gem install <other_gem>之前运行bundle install来解决它,但是我更喜欢捆绑器管理它,尤其是考虑到我正在使用自定义的gem服务器时。

我尝试将gem添加到gemspec行之前的Gemfile中,但是没有运气。

宝石文件:

source 'https://my.gemserver.com/gems'

gemspec

mygem.gemspec:

require 'external/dependency'

Gem::Specification.new do |spec|
  spec.name = 'mygem'
  spec.version = External::Dependency.version_helper
  ....
  spec.add_development_dependency 'external-dependency'
end

编辑: 另一个解决方法是抢救LoadError并在未加载依赖项的情况下指定默认版本。另外,也不理想

begin
  require 'external/dependency'
rescue LoadError; end

Gem::Specification.new do |spec|
  spec.name = 'mygem'
  spec.version = defined?(External::Dependency) ? External::Dependency.version_helper : ''
  ....
  spec.add_development_dependency 'external-dependency'
end

2 个答案:

答案 0 :(得分:0)

我认为您坚持使用gem install。但是我可以通过将该步骤添加到用于该项目的Dockerfile中来解决此问题。

也许可以使用rbenv或rvm做类似的事情?自从迁移到Docker以来,没有使用过任何一个,但是rvm gemset是一种引导程序...

答案 1 :(得分:0)

我通过使gemspec在捆绑更新或安装期间安装gem来解决这个问题。

newComponent.instance

然后...

EXTERNAL_DEPENDENCY = Gem::Dependency.new('external-dependency', '~> 0.1')
if File.basename($0) == 'bundle' && ARGV.include?('update') || ARGV.include?('install')
  require 'rubygems/dependency_installer'
  Gem::DependencyInstaller.new.install(EXTERNAL_DEPENDENCY)
end