Попытка создать драгоценный камень, получение исключения Gem ::InvalidSpecificationException: «[…] не являются файлами»

#ruby #rubygems #gem #gemspecs

#ruby #rubygems #gem #gemspecs

Вопрос:

Я пытаюсь создать пользовательский драгоценный камень, который я написал, client_package но он терпит неудачу.

Моя структура каталогов выглядит следующим образом:

 client_package
    Gemfile
    Gemfile.lock
    client_package.gemspec
    Rakefile
    Readme.md
    .gitignore
    .git
        ...git files...
    lib
        client_package.rb
        client_package
            version.rb
            api.rb
            ...more...
  

И мой client_package.gemspec выглядит так:

 # encoding: UTF-8
require File.expand_path('../lib/client_package/version', __FILE__)

Gem::Specification.new do |s|
    s.name = 'client_package'
    s.version = ClientPackage::VERSION
    s.platform = Gem::Platform::RUBY

    s.files = `git ls-files`.split('n')
    s.executables = `git ls-files -- bin/*`.split('n').map{ |f| File.basename(f) }
    s.require_paths = ['lib']

    # also have s.authors, s.email, s.homepage, s.summary, s.description

    s.add_dependency 'httparty'
    s.add_dependency 'json'
end
  

И все мои файлы зафиксированы, а состояние git чистое.

Из верхнего client_package каталога я запускаю gem build client_package.gemspec и получаю эту ошибку:

 ERROR:  While executing gem ... (Gem::InvalidSpecificationException)
    [".gitignore
Gemfile
Rakefile
Readme.md
client_package.gemspec
lib/client_package.rb
lib/client_package/api.rb
lib/client_package/version.rb
lib/client_package/...more...
"] are not files
  

Это меня озадачивает, потому что для меня это, безусловно, файлы. В любом случае, я подумал, что есть какая-то проблема с путем, если он не видит эти файлы, и, просто выполнив несколько проб и ошибок, я обнаружил, что если я поднимаюсь по каталогу (на один выше верхнего уровня client_package ), а затем запускаю gem build client_package/client_package.gemspec , сначала кажется, что он работает, создавая файл client_package-1.0.0.gem . Но что-то все еще не так. Если я затем установлю этот драгоценный gem install client_package-1.0.0.gem камень, это также сработает. Но тогда это:

 require 'rubygems'
require 'client_package'
  

ВОЗВРАТ LoadError: no such file to load -- client_package .

Я чувствую, что, должно быть, упускаю что-то маленькое, но важное. Есть идеи?

Ответ №1:

Оправдания для восстановления этой старой темы, но я нашел другую причину: если вы не проверяли в git, некоторые старые (удаленные файлы) могут помешать: на диске они не существуют, но git ls-файлы сообщают о них как о включенных в gem.

Проверьте файлы, и эта точная ошибка устранена.

Комментарии:

1. Это была именно наша проблема. Спасибо!

2. Приветствия @HugoLogmans! У меня был удаленный файл, который вызывал эту проблему — как только я запустил git rm <deleted_filename> (например, поставил удаление файла), тогда все было в порядке — мне не нужно было фактически фиксировать.

3. в этом случае, даже если вы не хотите фиксировать, вы можете просто сделать git add . так, чтобы команда gem игнорировала удаленные файлы..

4. Это спасло мне день. Я удалил сертификат подписи gem, но сборка gem все еще жалуется, потому что git ls-файлы считают, что сертификат все еще присутствует.

Ответ №2:

Это было бы небольшим, но важным:

Должно split('n') быть split("n") ?

Потому что это выглядит так

 [".gitignore
Gemfile
Rakefile
Readme.md
client_package.gemspec
lib/client_package.rb
lib/client_package/api.rb
lib/client_package/version.rb
lib/client_package/...more...
"]
  

может быть массивом, содержащим одну многострочную строку, а не массив из нескольких строк.

Комментарии:

1. Я и моя зависимость от одинарных кавычек =).