繁体   English   中英

使用本机扩展安装 Ruby gem

[英]Install Ruby gem with Native Extension

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

宝石结构如下:

.
├── ...
├── 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没有到位!

怎么了?

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

此外,我遵循 rubygems 的约定,将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/中移动共享的 object

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

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

瞧! 有用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM