Установите гем Ruby с собственным расширением
Я создаю новый драгоценный камень, который использует FFI для создания рубиновой привязки к
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
он компилирует библиотеку и добавляет в
lib/
реж.
Но когда я бегу
rake install:local
в
webview.so
не на месте!
Что случилось?
1 ответ
Мне нужно было добавить
ext
папка для git с помощью
git add ext/
Сюда
git ls-files
смог захватить его и включил файл в процесс установки.
Кроме того, я последовал соглашению о rubygems, перейдя и создав
webview.rb
в
lib/
который содержит только:
require_relative "webview/webview"
Кроме того, я добавил этот блок в
Rake::ExtensionTask
в
Rakefile
:
Rake::ExtensionTask.new "webview" do |ext|
ext.lib_dir = "lib/webview"
end
чтобы переместить общий объект внутри
lib/webview/
Последнее, что я сделал, это позвонил
ffi_lib
с абсолютным путем, а не относительным путем, например:
ffi_lib File.dirname(__FILE__) + '/webview.so'
И вуаля! оно работает