如何确定 ruby gem 是否实际上是原生 C 扩展?
运行gem install some_gem
时,我可以看到它何时尝试构建本机扩展,但是有没有办法在安装之前确定哪些 gem 是本机 C 扩展?
您可以检查 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?'
让我们比较一下bson和bson_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"]'