首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从extconf.rb读取gem文件规范?

如何从extconf.rb读取gem文件规范?
EN

Stack Overflow用户
提问于 2015-07-08 10:21:09
回答 1查看 106关注 0票数 2

我正在构建一个具有各种第三方可执行需求的Ruby文件(一些非红宝石工具,然后它将通过系统调用使用)。

需求列表是使用set规范提供信息的requirements列表指定的,我的任务是创建一个设置,在安装过程中验证该需求列表--本质上将requirements列表从信息列表转换为权威列表。

我最初的方法是使用extensions,就像在extconf.rb模式中一样,在安装过程中运行一些ruby代码,这些代码将验证需求列表,如果不满足需求,则失败安装。

因此,我目前的实现是使用ext/Rakefile,它使用硬编码路径读取some文件,使用自定义(但直接和简单)语法解析requirements列表,并对所需的可执行文件运行一些简单的测试。

我真的很想考虑到是否依赖于了解out文件的路径,这样我就可以在其他项目中以模块化的方式重用代码。

为了完成(并且希望它对某人有用),下面是我的代码--它使用Gem::Ext::Builder "Rakefile模式“来运行一些任意代码。

代码语言:javascript
复制
require 'rubygems'
require 'mkmf'

def verify_requirement(reqspec)
  exe, version_spec, version_regex = reqspec.split(/\s*,\s*/,3)

  exe = $1 if exe =~ /\[([^\]]+)\]/ # support human readable alias for executable name

  abort "Missing required executable #{exe}!" unless find_executable(exe)
  return unless version_spec # no version is specified, so executable existing is good enough

  version = %x|#{exe} --version 2>&1|.chomp
  version = %x|#{exe} -version 2>&1|.chomp unless $?.success? 
  abort "Error checking for version of #{exe}: (#{$?.exitstatus}) #{version}" unless $?.success?

  if version_regex
    abort "Version test '#{version_regex}' failed to match '#{version}'!" unless version =~ /#{version_regex}/m
    abort "Version test '#{version_regex}' failed to generate a version number!" unless $1
    version = $1
  end

  abort "Failed to locate a valid version number for #{exe}, found '#{version}'" unless version =~ /^[0-9\.]+/
  abort "Insufficient version '#{version}' for #{exe} - requires #{version_spec}"  unless Gem::Dependency.new(exe, version_spec).match? exe, version
end

task :default do
  gemspec = File.absolute_path('../my.gemspec')
  Gem::Specification::load(gemspec).requirements.each do |req|
    verify_requirement(req)
  end
end

此代码要求requirements使用以下任何一种语法:

  • exe-file[, <semantic-version-spec>[, <version-garabbing-regex>]]
  • alias '[' exe-file ']'[, <semantic-version-spec>[, <version-garabbing-regex>]]

例如:

代码语言:javascript
复制
spec.requirements << 'sox'
spec.requirements << 'ffmpeg, >= 2.5, ffmpeg version ([\d\.]+)'
spec.requirements << 'ImageMagick [convert], >= 6.7.5, ImageMagick ([\d\.]+)'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-10 10:49:07

Gem::Specification类可用于加载和解析gemspec。我在ext/Rakefile中使用以下代码执行基于gemspec文件的任务:

代码语言:javascript
复制
task :default do
  gemspec = File.absolute_path('../gemname.gemspec')
  Gem::Specification::load(gemspec).requirements.each do |req|
    verify_requirement(req)
  end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31289821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档