3

我希望我有点密集,但是当捆绑器似乎没有构建它们时,我不知道应该如何使用捆绑器开发和测试带有本机扩展的宝石。

我有一个 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……但是测试呢?我习惯于使用我的 gem 目录中的 rspec,但它总是从那里尝试加载.没有构建本机扩展的版本。

github上的这个问题表明捆绑器可能无法处理这个问题?这怎么可能?

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

4

1 回答 1

3

通常这是作为一项rake任务完成的,例如rake compile,您确保在测试之前运行该任务。

我将一个可以执行此操作的骨架 gem 放在一起,以及本地扩展 gem 中预期的其他标准内容,这里: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 上的各种 gem 来收集这个,直到我发现我觉得很适合用bundle gem.

于 2013-06-04T21:26:40.613 回答