【问题标题】:Install Ruby gem with Native Extension使用本机扩展安装 Ruby gem
【发布时间】:2021-03-09 08:34:31
【问题描述】:

我正在创建一个新的 gem,它使用 FFI 创建一个到 webview C 库的 ruby​​ 绑定

gem结构如下:

.
├── ...
├── Rakefile
├── ext
│   └── webview
│       ├── extconf.rb
│       ├── webview.cc
│       └── webview.h
├── lib
│   ├── webview
│   │   └── version.rb
│   ├── webview.rb
│   └── webview.so
├── ...
└── webview.gemspec

Rakefile 如下:

require "bundler/gem_tasks"
require "rubocop/rake_task"
require "rake/extensiontask"

RuboCop::RakeTask.new
task default: :rubocop

Rake::ExtensionTask.new "webview"

Gemspec 如下:

# frozen_string_literal: true

require_relative "lib/webview/version"

Gem::Specification.new do |spec|
  ...
  # Specify which files should be added to the gem when it is released.
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
    `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
  end
  spec.bindir        = "exe"
  spec.executables   = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
  spec.require_paths = ["lib"]

  spec.extensions = ["ext/webview/extconf.rb"]

  # Uncomment to register a new dependency of your gem
  spec.add_dependency "ffi"
  spec.add_dependency "rake-compiler"
end

当我运行rake compile 时,它会编译库并将webview.so 添加到lib/ 目录中。

但是当我运行rake install:local 时,webview.so 不在位!

怎么了?

【问题讨论】:

    标签: ruby rubygems ruby-native-extensions


    【解决方案1】:

    我需要使用git add ext/ext 文件夹添加到git,这样git ls-files 能够捕获它并将该文件包含在安装过程中。

    此外,我遵循 ruby​​gems 的约定,将 webview.rb 移动到 lib/webview/ 并在 lib/ 中创建了一个 webview.rb,其中仅包含:

    require_relative "webview/webview"
    

    另外,我将此块添加到Rakefile 中的Rake::ExtensionTask

    Rake::ExtensionTask.new "webview" do |ext|
      ext.lib_dir = "lib/webview"
    end
    

    为了在lib/webview/里面移动共享对象

    最后,我用绝对路径而不是像这样的相对路径调用ffi_lib

    ffi_lib File.dirname(__FILE__) + '/webview.so'
    

    还有,瞧!它有效

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-23
      • 2013-06-28
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      相关资源
      最近更新 更多