5

如何确定 ruby​​ gem 是否实际上是原生 C 扩展?

运行gem install some_gem时,我可以看到它何时尝试构建本机扩展,但是有没有办法在安装之前确定哪些 gem 是本机 C 扩展?

4

1 回答 1

1

您可以检查 gem 规范以查看是否extensions已定义。您必须下载 gem 或检查其源代码才能执行此操作,但使用一些 unix-fu 以编程方式执行此操作并不难:

curl -L <gem-url> | tar xOf - metadata.gz | gunzip | ruby -r yaml -e 'p YAML.load($stdin.read).extensions.any?'

让我们比较一下bsonbson_ext(因为它们是我能想到的同一个 gem 的第一个非 C 扩展和 C 扩展版本):

% curl -L https://rubygems.org/downloads/bson-1.8.0.gem | tar xOf - metadata.gz | gunzip | ruby -r yaml -e 'p YAML.load($stdin.read).extensions.any?'
false

% curl -L https://rubygems.org/downloads/bson_ext-1.8.0.gem | tar xOf - metadata.gz | gunzip | ruby -r yaml -e 'p YAML.load($stdin.read).extensions.any?'
true

您可以使用RubyGems API自动了解 gem 的当前版本:

curl https://rubygems.org/api/v1/gems/bson.yaml | ruby -r yaml -e 'p YAML.load($stdin.read)["version"]'
于 2012-12-10T01:15:41.683 回答