Ruby C扩展gem在安装时不编译

时间:2015-04-23 09:07:41

标签: ruby gem ruby-c-extension

我有一个小项目,我想通过gem分享。必须在用户系统上编译此扩展。因此,必须在安装gem时完成编译。

我的项目很简单:

tree                                                                                                                                                                  
├── myext.gemspec
├── ext
│   └── myext
│       └── myext.c
│       └── extconf.rb
├── lib
│   ├── myext
│   └── myext.rb
├── Rakefile
└── test

我检查了extconf.rb,编译工作如果我

ruby extconf.rb && make

我有一个myext.gemspec:

Gem::Specification.new do |s|
  s.name        = 'myext'
  s.version     = '0.0.1'
  s.date        = '2015-04-22'
  s.summary     = "an extension"
  s.description = "an extension that is mine"
  s.authors     = ["cedlemo"]
  require "rake" #for FileList
  s.files       = FileList['lib/*/*.{so}',
                     'lib/*.{rb}'
                    ].to_a
  s.extensions = %w(ext/myext/extconf.rb)
  s.add_development_dependency 'rake-compiler', '~> 0' 
  s.license       = 'MIT'
end

这是我的Rakefile:

require "rubygems"
require "rake/extensiontask"

spec = Gem::Specification.load('myext.gemspec')

Rake::ExtensionTask.new "myext", spec do |ext|
  ext.lib_dir = "lib/myext"
end

当我构建我的宝石时,一切都很好:

gem build myext.gemspec

当我安装gem时,我没有任何错误消息:

gem install myext-0.0.1.gem                                                                                                                                          
Building native extensions.  This could take a while...
Successfully installed myext-0.0.1
1 gem installed

我的问题是C代码没有编译,我没有安装任何.so文件:

/home/cedlemo/.gem/ruby/2.2.0/gems/myext-0.0.1/
├── ext
│   └── myext
│       ├── extconf.rb
│       └── Makefile
└── lib
    └── myext.rb

PS:  我已经阅读了很多文档(官方或博客......),每个人都在做自己的东西,所以它不是很清楚,我找不到解决方案所以不要发送链接到http://guides.rubygems.org/示例

1 个答案:

答案 0 :(得分:2)

您尚未将源文件包含在files的{​​{1}}部分中,因此安装gem时无需编译。确保包含所有需要的文件:

gemspec

您不需要包含s.files = FileList['lib/**/*.rb', 'ext/**/*.{rb,c,h}'] 个文件,因为它们将在安装期间构建(实际上可能不是.so)。另外我认为你不需要添加.soto_a基本上已经是一个数组了。