为什么不捆绑安装我的本地gem w /扩展名?

时间:2014-01-05 18:05:29

标签: ruby-on-rails ruby gem bundler native

我有一个宝石我正在本地开发,具有以下结构:

foo
  ext
   foo
    extconf.rb
    foo.cpp
    foo.h
    etc.cpp
    etc.h
  lib
 foo.gemspec

--- foo.gemspec -

Gem::Specification.new do |s|
  s.name    = "foo"
  s.version = "0.0.2"
  s.author  = "Aemon Cannon"
  s.files = Dir["ext/foo/*.{h,cpp}"] + Dir["lib/**/*"] + Dir['ext/**/extconf.rb']
  s.platform = Gem::Platform::RUBY
  s.require_paths = [ 'lib', 'ext' ]
  s.extensions = Dir['ext/**/extconf.rb']
end

--- ext / foo / extconf.rb ----

require 'mkmf'
$CPPFLAGS += "-std=c++11 -Wno-unused-value "
abort "missing libz" unless  have_library("z")
abort "missing c++ standard library" unless have_library("stdc++")
create_makefile "foo"

我使用gem build foo构建一个gem,它似乎构建成功,然后将gem添加到我的rails app下的vendor / gems。我在我的Gemfile中提到它:

gem 'foo', '0.0.2', :path => 'vendor/gems'

当我'捆绑安装'时,它说:

Using foo (0.0.2) from source at vendor/gems

但它似乎没有构建扩展,现在gem已经从供应商/宝石中删除,并且没有出现在供应商/缓存中。

'gem install foo-0.0.1.gem'正确安装gem,成功构建原生扩展。

Rails版本3.2.x. Bundler 1.5.x

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:1)

Bundler docs for using :path说:

  

:git 不同,bundler不会为指定为路径的gem编译C扩展。

我的理解是:path主要用于与您正在积极开发的宝石一起使用,而Bundler期望在该位置“准备好”代码。如果要使用:path,则应首先手动编译扩展(可能使用rake-compiler)。