При выполнении gem ... ["extconf.rb", ...] не являются файлами - PullRequest
18 голосов
/ 06 июня 2011

Я пытаюсь собрать рубиновый камень вокруг расширения C. Расширение C прекрасно компилируется с помощью подпрограммы ruby extconf.rb; make; sudo make install, но когда я пытаюсь собрать гем с помощью rake, процесс завершается с ошибкой внизу этой трассы.

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

Что не так с моей конфигурацией? Мои gemspec и Rakefile находятся ниже трассы (гем называется netconf).

// Трассировка

** Execute copy:netconf:i686-linux:1.9.2
install -c tmp/i686-linux/netconf/1.9.2/netconf.so lib/netconf/netconf.so
** Execute compile:netconf:i686-linux
** Execute compile:i686-linux
** Execute compile
** Invoke chmod (first_time)
** Execute chmod
** Execute build
rake aborted!
ERROR:  While executing gem ... (Gem::InvalidSpecificationException)
    ["extconf.rb", "netconf.o", "netconf.so"] are not files

// netconf.gemspec

# -*- encoding: utf-8 -*-
$:.push File.expand_path("../lib", __FILE__)
require "netconf/version"

Gem::Specification.new do |s|
  s.name        = "netconf"
  s.version     = Netconf::VERSION
  s.authors     = ["..."]
  s.email       = ["..."]
  s.homepage    = "..."
  s.summary     = %q{A tool to access and write Ubuntu network configuration}
  s.description = %q{Uses ifconfig and other C system calls to access network configurations on a Ubuntu install.}

  s.rubyforge_project = "netconf"

  s.files         = `git ls-files`.split("\n")
  s.executables   = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
  s.require_paths = ["lib"]
  s.extensions    = ["ext/netconf/extconf.rb"]
end

// Rakefile

require 'rake'
require 'rake/extensiontask'
require 'bundler'

Rake::ExtensionTask.new("netconf") do |extension|
  extension.lib_dir = "lib/netconf"
end

task :chmod do
  File.chmod(0775, 'lib/netconf/netconf.so')
end

task :build => [:clean, :compile, :chmod]

Bundler::GemHelper.install_tasks

Ответы [ 2 ]

44 голосов
/ 03 октября 2011

Я получил эту ошибку, потому что я еще не отправил свои обновления с помощью git.

s.files         = `git ls-files`.split("\n")

Эта строка напрямую использует git и, вероятно, вызывает эту ошибку.Просто сделай

git add .
git commit -a -m "init"
0 голосов
/ 18 мая 2017

FWIW, у меня была похожая проблема, где

s.files         = `git ls-files`.split("\n")

был

s.files         = `git ls-files`.split('\n')

, где одинарные кавычки мешали правильному разбиению списка файлов. Изменение двойных кавычек исправило проблему для меня.

...