在解析 gemspec 之前,如何安装 gem(通过使用 gemspec 的捆绑器)?
How can I install a gem (via bundler using gemspec) before parsing the gemspec?
我有一个 gem 是为了帮助版本控制而存在的。在 gemspec 文件中定义版本时,让这个 gem 可用是很有用的。
然而,问题是 运行 bundle install
首先导致 gemspec 被解析,这导致错误,因为所需的 gem 不是'尚未安装。
我可以在 bundle install
之前通过 运行 gem install <other_gem>
解决它,但我更喜欢捆绑器管理它,尤其是考虑到我使用的是自定义gem 服务器。
我试过将 gem 添加到 Gemfile 的 gemspec 行之前,但没有成功。
宝石文件:
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
我认为你坚持 gem install
。但我会通过将该步骤添加到我用于项目的 Docker 文件来解决这个问题。
也许可以使用 rbenv 或 rvm 做这样的事情?自从迁移到 Docker 之后就没有使用过其中任何一个,但是 rvm gemset 有点像 bootstrap...
我通过在捆绑包更新或安装期间让 gemspec 安装 gem 来绕过它。
EXTERNAL_DEPENDENCY = Gem::Dependency.new('external-dependency', '~> 0.1')
if File.basename([=10=]) == 'bundle' && ARGV.include?('update') || ARGV.include?('install')
require 'rubygems/dependency_installer'
Gem::DependencyInstaller.new.install(EXTERNAL_DEPENDENCY)
end
然后...
spec.add_development_dependency EXTERNAL_DEPENDENCY.name, EXTERNAL_DEPENDENCY.requirements_list
我有一个 gem 是为了帮助版本控制而存在的。在 gemspec 文件中定义版本时,让这个 gem 可用是很有用的。
然而,问题是 运行 bundle install
首先导致 gemspec 被解析,这导致错误,因为所需的 gem 不是'尚未安装。
我可以在 bundle install
之前通过 运行 gem install <other_gem>
解决它,但我更喜欢捆绑器管理它,尤其是考虑到我使用的是自定义gem 服务器。
我试过将 gem 添加到 Gemfile 的 gemspec 行之前,但没有成功。
宝石文件:
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
我认为你坚持 gem install
。但我会通过将该步骤添加到我用于项目的 Docker 文件来解决这个问题。
也许可以使用 rbenv 或 rvm 做这样的事情?自从迁移到 Docker 之后就没有使用过其中任何一个,但是 rvm gemset 有点像 bootstrap...
我通过在捆绑包更新或安装期间让 gemspec 安装 gem 来绕过它。
EXTERNAL_DEPENDENCY = Gem::Dependency.new('external-dependency', '~> 0.1')
if File.basename([=10=]) == 'bundle' && ARGV.include?('update') || ARGV.include?('install')
require 'rubygems/dependency_installer'
Gem::DependencyInstaller.new.install(EXTERNAL_DEPENDENCY)
end
然后...
spec.add_development_dependency EXTERNAL_DEPENDENCY.name, EXTERNAL_DEPENDENCY.requirements_list