当bundler从源代码中包含gem时,如何使用本机扩展来测试gem?

时间:2013-06-04 20:35:33

标签: ruby gem bundler

我希望自己有点密集,但是当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表明捆绑包可能无法处理此问题?怎么可能呢?

请帮我看看我错过了什么。

1 个答案:

答案 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创建的宝石。