我希望自己有点密集,但是当Bundler似乎没有构建它们时,我无法弄清楚应该如何使用bundler开发和测试带有本机扩展的gem。
我有一个gem swig_try1
,这只是我如何构建原生扩展的练习。我可以构建gem并安装它,我看到预期的Building native extensions
消息,构建成功,当我转到另一个目录时,我可以要求gem并使用本机扩展中定义的方法。
我的问题在于,当我运行bundle install
时,我看到了这一行:
Using swig_try1 (0.0.1) from source at .
但我没有看到Building native extensions
消息,并且它没有显示在我的目录结构中:
.
├── Gemfile
├── Gemfile.lock
├── LICENSE.txt
├── README.md
├── Rakefile
├── ext
│ └── swig_try1
│ ├── extconf.rb
│ └── swig.c
├── lib
│ ├── swig_try1
│ │ └── version.rb
│ └── swig_try1.rb
├── pkg
│ └── swig_try1-0.0.1.gem
└── swig_try1.gemspec
,即Makefile
中没有生成ext/swig_try1
,也没有生成swig_try1.bundle
(在我的rvm gems目录中,我看到了这些文件)。
我可以继续我的业务,只从其他目录中使用我的宝石......但是测试怎么样?我习惯使用我的gem目录中的rspec,但是从那里开始尝试加载.
的版本,该版本没有构建本机扩展。
这issue on github表明捆绑包可能无法处理此问题?怎么可能呢?
请帮我看看我错过了什么。
答案 0 :(得分:3)
通常,这是以rake
任务完成的,例如rake compile
,您确保在测试之前运行。
我把一个骷髅宝石放在一起,除了本地扩展宝石中预期的其他标准内容之外,还有:https://github.com/neilslater/ruby_nex_c
Rakefile
中的关键行是:
require 'rake/extensiontask'
gemspec = Gem::Specification.load('foo.gemspec')
Rake::ExtensionTask.new do |ext|
ext.name = 'foo'
ext.ext_dir = 'ext/foo'
ext.lib_dir = 'lib/foo'
ext.gem_spec = gemspec
end
task :default => [:compile, :test]
然后,您可以使用简单命令rake
运行组合编译/测试,这对Travis CI非常方便。
许多其他结构都是可能的 - 我通过阅读github上的各种宝石来收集这个结构,直到我发现一些我认为非常适合用bundle gem
创建的宝石。