0

我正在创建一个使用 FFI 创建与webviewC 库的 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.solib/目录中。

但是我运行rake install:local的时候webview.so是不到位的!

怎么了?

4

1 回答 1

0

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

此外,我遵循了 ruby​​gems 的约定,webview.rb进入lib/webview/并创建了一个webview.rblib/包含:

require_relative "webview/webview"

另外,我将此块添加到Rake::ExtensionTaskin Rakefile

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

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

最后一件事,我做的是ffi_lib用绝对路径而不是这样的相对路径来调用:

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

瞧!有用

于 2021-03-09T12:38:35.837 回答