'rake native' завершается неудачно с "неопределенным методом split для nil: NilClass" - PullRequest
0 голосов
/ 27 февраля 2019

Я создаю расширение 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...