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

Ruby 当bundler从源代码中包含gem时,如何使用本机扩展测试gem?,ruby,gem,bundler,Ruby,Gem,Bundler,我希望我是有点笨,但我不知道如何使用bundler开发和测试带有本机扩展的gem,而bundler似乎并没有构建它们 我有一个gem,swig_try1,这只是我如何构建本机扩展的练习。我可以构建gem并安装它,我看到预期的构建本机扩展消息,构建成功,当我转到另一个目录时,我可以要求gem并使用本机扩展中定义的方法 我的问题在于,当我运行bundle install时,我看到这一行: Using swig_try1 (0.0.1) from source at . 但是我没有看到构建本机扩展的

我希望我是有点笨,但我不知道如何使用bundler开发和测试带有本机扩展的gem,而bundler似乎并没有构建它们

我有一个gem,
swig_try1
,这只是我如何构建本机扩展的练习。我可以构建gem并安装它,我看到预期的
构建本机扩展
消息,构建成功,当我转到另一个目录时,我可以要求gem并使用本机扩展中定义的方法

我的问题在于,当我运行
bundle install
时,我看到这一行:

Using swig_try1 (0.0.1) from source at .
但是我没有看到
构建本机扩展的消息,它也没有显示在我的目录结构中:

.
├── 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
i、 例如,在
ext/swig_try1
中没有生成
Makefile
,也没有生成
swig_try1.bundle
(在我的rvm gems目录中,我看到了这些文件)

我可以继续我的业务,只使用其他目录中的gem…但是测试呢?我习惯于从gem目录中使用rspec,但它总是尝试从那里加载
版本,该版本没有构建本机扩展

这表明bundler可能无法处理此问题?这怎么可能呢


请帮我看看我遗漏了什么。

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

在本机扩展gem中预期的其他标准功能中,我构建了一个框架gem来实现这一点:

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

创建的gem。我注意到我的答案包括测试,但不包括项目
Gemfile
中的本地参考。这个问题的答案取决于您选择如何部署您的项目——如果您开始共享在开发中使用gem的项目,您可能需要删除本地链接。你的选择将为你指明正确的方向。太好了!这正是我想要的简单的解决方案。