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"]'