Я создаю расширение Ruby C, для которого я хотел бы создать предварительно упакованные бинарные пакеты, поскольку компиляция требует достаточного количества зависимостей.Я новичок в Ruby, но похоже, что gem
не хочет создавать пакеты для конкретной платформы, поэтому обычным способом является использование гема rake-compiler и выполнение rake native
.Я могу заставить его скомпилировать расширение, но затем происходит сбой с ошибкой
NoMethodError: undefined method `split' for nil:NilClass
Запуск с --trace показывает, что ошибка в rake-compiler-1.0.7 / lib / rake / extensiontask.rb: 515:
def ruby_api_version(ruby_version)
ruby_version.split(".")[0, 2].join(".")
end
Это потому, что ruby_version равен нулю.Он вызывается из rake-compiler-1.0.7 / lib / rake / extensiontask.rb: 262 в define_native_tasks ():
ruby_versions = @ruby_versions_per_platform[platf] || []
sorted_ruby_versions = ruby_versions.sort_by do |ruby_version|
ruby_version.split(".").collect(&:to_i)
end
spec.required_ruby_version = [
">= #{ruby_api_version(sorted_ruby_versions.first)}",
"< #{ruby_api_version(sorted_ruby_versions.last).succ}.dev"
]
@ruby_versions_per_platform
имеет значение {}
в конструкторе, но нетстрока кода когда-либо устанавливает его.Таким образом, sorted_ruby_versions
является пустым, а .first
и .last
равны нулю, что приводит к тому, что аргумент ruby_api_version
равен нулю.
Глядя на git обвинения в проекте, видно, что эти строки2 года, и результат набора изменений https://github.com/rake-compiler/rake-compiler/commit/0dc23504cb03ed2fb3c506e1bb58af48d3851d1e. Однако ruby_versions_per_platform
никогда не присваивается за пределами конструктора, что означает, что ruby_api_version
всегда будет вызываться с nil и всегда завершится ошибкой.Так как же это могло работать в течение двух лет?
И что еще более важно, что мне нужно сделать, чтобы rake native
действительно работал?
Я использую macOS 10.12.6, Ruby2.3.7p456, установленный с MacPorts (выбран с помощью port select --set ruby ruby26
), rake-компилятор 1.0.7 и rake-12.3.2.
Rakefile:
require "rake/extensiontask"
gemspec = Gem::Specification::load("mygem.gemspec")
Gem::PackageTask.new(gemspec) do |pkg|
end
Rake::ExtensionTask.new("mygem", gemspec) do |ext|
end
mygem.gemspec
Gem::Specification.new do |s|
s.name = "mygem"
s.version = "1.0.0rc1"
s.authors = [ "John Doe" ]
s.summary = "Awesome library"
s.description = "Awesome library because, reasons"
s.licenses = [ 'MIT' ]
s.email = "johndoe@null.com"
s.homepage = "http://www.null.com"
s.extensions = %w[ext/mygem/extconf.rb]
s.files = FileList['lib/**/*.rb', 'ext/**/*.{rb,c,h}']
s.platform = Gem::Platform::RUBY
s.required_ruby_version = '>= 1.8'
end
Макет моего проекта
Rakefile
mygem.gemspec
ext/
mygem/
extconf.rb
mygem.c (generated with SWIG 3.0)
lib/
mygem.rb