试图构建一个gem,得到一个Gem :: InvalidSpecificationException:"[...]不是文件"

Ben*_*Lee 21 ruby gem rubygems gemspecs

我正在尝试构建一个我写过的自定义gem,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...
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

并且我的所有文件都已提交,并且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
Run Code Online (Sandbox Code Playgroud)

这对我来说很困惑,因为那些肯定似乎是我的档案.无论如何,我认为如果它没有看到这些文件会有一些路径问题,并且只是做了一些试验和错误我发现如果我上一个目录(一个在顶层之上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'
Run Code Online (Sandbox Code Playgroud)

退货LoadError: no such file to load -- client_package.

我觉得我必须错过一些小而重要的东西.有任何想法吗?

Hug*_*ans 46

复活这个旧线程的借口,但我找到了另一个原因:如果你没有检查git,一些旧的(已删除的文件)可能会干扰:在磁盘上它们不存在,但git ls-files migh报告它们包含在宝石.

签入文件,这个确切的错误结束了.

  • 干杯@HugoLogmans!我有一个删除的文件导致了这个问题 - 一旦我运行`git rm <deleted_filename>`(例如暂存文件删除)然后我没事 - 我没有必要实际提交. (7认同)
  • 在这种情况下,即使你不想提交,你也可以做`git add .`,这样gem命令就会忽略已删除的文件. (2认同)

And*_*imm 15

这很小但很重要:

应该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...
"]
Run Code Online (Sandbox Code Playgroud)

可以是包含单个多行字符串的数组,而不是包含多个字符串的数组.

  • 我和我对单引号的瘾=). (3认同)