Установите гем 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'

И вуаля! оно работает

Другие вопросы по тегам