尝试使用forked gem时出现Gem::LoadError错误

5

我的目标是使用libmspack。它依赖于ffi-compiler,我已经fork了ffi-compiler,添加了一些自定义代码,并且我希望libmspack使用我的修改版。 我有一个简单的Gemfile:

source 'http://rubygems.org'

gem 'ffi-compiler', :github =>'survili/ffi-compiler'
gem 'libmspack'

在运行 'bundle install' 时,'ffi-compiler' 的安装完成了,但是 'libmspack' 安装失败了,并且出现了一个错误,它找不到 'ffi-compiler'。(LoadError: cannot load such file -- ffi-compiler/compile_task)。我注意到如果从 Gemfile 中删除 'libmspack',并尝试使用 'bundle exec install libmspack' 进行安装,它可以正常工作。有人能解释一下,实现我的目标的正确方法是什么,使 libmspack 使用自定义 ffi-compiler gem?我在这个 SO 帖子中发现了同样的问题,但没有答案: Gem::LoadError when using a git repo in Gemfile。谢谢您提前的帮助。
------ bundle 的输出(使用 RVM 的空 gemset)-------
jackju at macbook-air  ~/tmp/delme1
$ rvm use 2.1.1@stackoverproblem --create
ruby-2.1.1 - #gemset created /home/jackju/.rvm/gems/ruby-2.1.1@stackoverproblem
ruby-2.1.1 - #generating stackoverproblem wrappers...........
Using /home/jackju/.rvm/gems/ruby-2.1.1 with gemset stackoverproblem
jackju at macbook-air  ~/tmp/delme1
$ rvm current
ruby-2.1.1@stackoverproblem
jackju at macbook-air  ~/tmp/delme1
$ vim Gemfile

[1]+  Stopped                 vim Gemfile
jackju at macbook-air  ~/tmp/delme1
$ rvm current
ruby-2.1.1@stackoverproblem
jackju at macbook-air  ~/tmp/delme1
$ gem list

*** LOCAL GEMS ***

bigdecimal (1.2.4)
bundler (1.5.3)
bundler-unload (1.0.2)
executable-hooks (1.3.1)
gem-wrappers (1.2.4)
io-console (0.4.2)
json (1.8.1)
minitest (4.7.5)
psych (2.0.3)
rake (10.1.0)
rdoc (4.1.0)
rubygems-bundler (1.4.2)
rvm (1.11.3.9)
test-unit (2.1.1.0)
jackju at macbook-air  ~/tmp/delme1
$ bundle
Fetching git://github.com/survili/ffi-compiler.git
remote: Reusing existing pack: 260, done.
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 265 (delta 2), reused 0 (delta 0)
Receiving objects: 100% (265/265), 38.59 KiB | 0 bytes/s, done.
Resolving deltas: 100% (116/116), done.
Fetching gem metadata from http://rubygems.org/.........
Fetching additional metadata from http://rubygems.org/..
Resolving dependencies...
Installing rake (10.3.1)
Installing ffi (1.9.3)
Using ffi-compiler (0.1.4) from git://github.com/survili/ffi-compiler.git (at master)

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /home/jackju/.rvm/rubies/ruby-2.1.1/bin/ruby -rubygems /home/jackju/.rvm/gems/ruby-2.1.1@stackoverproblem/gems/rake-10.3.1/bin/rake RUBYARCHDIR=/home/jackju/.rvm/gems/ruby-2.1.1@stackoverproblem/extensions/x86_64-linux/2.1.0/libmspack-0.0.4 RUBYLIBDIR=/home/jackju/.rvm/gems/ruby-2.1.1@stackoverproblem/extensions/x86_64-linux/2.1.0/libmspack-0.0.4
rake aborted!
LoadError: cannot load such file -- ffi-compiler/compile_task
/home/jackju/.rvm/gems/ruby-2.1.1@stackoverproblem/gems/libmspack-0.0.4/ext/Rakefile:1:in `<top (required)>'
(See full trace by running task with --trace)

rake failed, exit code 1

Gem files will remain installed in /home/jackju/.rvm/gems/ruby-2.1.1@stackoverproblem/gems/libmspack-0.0.4 for inspection.
Results logged to /home/jackju/.rvm/gems/ruby-2.1.1@stackoverproblem/extensions/x86_64-linux/2.1.0/libmspack-0.0.4/gem_make.out
An error occurred while installing libmspack (0.0.4), and Bundler cannot
continue.
Make sure that `gem install libmspack -v '0.0.4'` succeeds before bundling.
jackju at macbook-air  ~/tmp/delme1
$ ls
Gemfile
jackju at macbook-air  ~/tmp/delme1
$ 

听起来你使用的ffi-compiler分支可能与libmspack期望的版本不兼容。也许你需要分叉一个较早版本的ffi-compiler以供libmspack使用? - Greg Burghardt
@GregBurghardt - 不,那不是问题。它是兼容的。 - Jack Juiceson
也许 gem 'ffi-compiler',:github =>'manycolors/ffi-compiler',require: "ffi-compiler" - Tyrel Richey
@TyrelRichey - 谢谢,但是它没有帮助。 - Jack Juiceson
我现在可能有五分钟的糊涂,但是...我似乎在Github上找不到manycolors的ffi-compiler分支? - janfoeh
显示剩余8条评论
1个回答

2
问题是缺少'rubygems/tasks',该gem可以在此处找到:https://github.com/postmodern/rubygems-tasks
我能够按照以下步骤在我的计算机上安装libmspack:
  1. gem install rubygems-tasks

  2. git clone git@github.com:survili/ffi-compiler.git

  3. cd ffi-compiler

  4. rake build gem

  5. gem install pkg/ffi-compiler-0.1.4.gem

  6. gem install libmspack -v '0.0.4'

Successfully installed libmspack-0.0.4 
1 gem installed

这很奇怪。而且,gem列表中没有显示“ffi-compiler”。我不得不再次手动安装ffi-compiler:gem install ffi-compiler --source "https://github.com/survili/ffi-compiler.git"以在列表中显示此gem。但现在,由于ffi-compiler / compile_task#33中的其他问题,libmspack安装再次失败。 - Syed Aslam
了解其中的原因将是很好的。您目前的答案最终允许安装gem,但实际上并不实用。我想在Gemfile中拥有它,并运行bundle(而不是创建一个长的README文件..) - Jack Juiceson
2
这是正确的方法,克隆之后只需执行 gem build ffi-compiler.gemspecgem install ffi-compiler-0.1.4.gem,然后您就不需要安装 rubygems-tasks。否则,必须手动安装,因为 rake 任务依赖于它,所以无法安装它。至于 bundle install,它不起作用,因为 Bundler 在安装 'libmspack' 时不会将您的 ffi-compiler 版本附加到加载路径中,原因是在 Gemfile 中指定了应用程序的依赖项而不是其他依赖项的依赖项。 - davispuh
3
如果您想要全部自动化,您需要fork libmspack,并将 gem 'ffi-compiler', :github =>'survili/ffi-compiler' 添加到Gemfile中,然后在您的应用程序中添加您的fork,如gem 'libmspack', :github =>'survili/libmspack'。我没有将 ffi-compiler主分支添加到 libmspack 的Gemfile中,因为这只是暂时的,总有一天 ffi-compiler 将发布新版本,因此不需要任何特殊步骤。但请看 https://github.com/ffi/ffi/issues/339。 - davispuh
1
是的,有点。在你的Gemfile中,你为你的应用程序指定依赖项,因此理论上你的应用程序依赖项可以使用与你已经在应用程序中使用的相同宝石的不同版本,但说实话我不确定是否会存在冲突以及它是否能够正常工作。 - davispuh
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接