Ruby 当bundler从源代码中包含gem时,如何使用本机扩展测试gem?
我希望我是有点笨,但我不知道如何使用bundler开发和测试带有本机扩展的gem,而bundler似乎并没有构建它们 我有一个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 . 但是我没有看到构建本机扩展的
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的项目,您可能需要删除本地链接。你的选择将为你指明正确的方向。太好了!这正是我想要的简单的解决方案。