"Не удалось создать собственное расширение gem" в Windows 7 (система не может найти указанный путь)

Короче проблема

Я на Windows и получаю следующую ошибку при запуске gem install json —platform=ruby:

The system cannot find the path specified.
Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...
The system cannot find the path specified.
ERROR:  Error installing json:
    ERROR: Failed to build gem native extension.

    C:/Ruby193/bin/ruby.exe extconf.rb
creating Makefile


Gem files will remain installed in C:/Ruby193/lib/ruby/gems/1.9.1/gems/json-1.8.1 for inspection.
Results logged to C:/Ruby193/lib/ruby/gems/1.9.1/gems/json-1.8.1/ext/json/ext/generator/gem_make.out

Предпосылки и некоторые исследования

Итак, во-первых, я не человек Windows, так что это дивный новый мир для меня. Унаследовав ноутбук от работы с разбросанной по нему безумной коллекцией библиотек, мне удалось удалить все предыдущие установки ruby ​​и Devkit, а затем установить следующее:

  • Ruby 1.9.3p484 с установщиком Ruby в C:/Ruby193
  • Ruby 2.0.0p353 с установщиком Ruby в C:/Ruby200
  • DevKit DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe (для рубина 1x) извлечено в C:/Ruby193-devkit
  • DevKit DevKit-mingw64-32-4.7.2-20130224-1151-sfx.exe (32-битный для ruby ​​2x) извлеченный в C:/Ruby200-devkit-x32,

Затем я установил Pik 0.2.8 в качестве драгоценного камня и побежал pik_install в новый каталог C:/bin согласно инструкции по установке.

Мой ПУТЬ выглядит так:

PATH=C:\bin;C:\Ruby193\bin;C:\windows;C:\windows\system32;C:\windows\system32\Wbem;c:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\;C:\Program Files (x86)\Common Files\Roxio Shared\DLLShared\;C:\Program Files\Java\jdk1.6.0_33\bin;C:\Program Files (x86)\Common Files\Apple\Mobile Device Support\;C:\Program Files (x86)\Common Files\Apple\Apple Application Support;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Program Files\TortoiseSVN\bin;C:/inpath;C:\Program Files (x86)\WinMerge;C:\ChromeDriver;C:\Program Files\WIDCOMM\Bluetooth Software\;C:\Program Files\WIDCOMM\Bluetooth Software\syswow64

Важные вещи в том, что C:/bin а также C:/Ruby193/bin в пути. Это означает, что ruby ​​1.9.3 загружается по умолчанию, когда я запускаю оболочку, и я могу успешно переключиться на 2.0.0 с pik use 2.0.0p353, Другими словами, пик работает нормально.

Devkit предназначен для обеспечения возможности компиляции собственных двоичных файлов C/C++ из гемов в Windows, чтобы избежать использования предварительно скомпилированных двоичных файлов Windows.

Поскольку у меня установлено две версии ruby, и для каждой из них требуется отдельный devkit (один для 2x и один для 1x), мне пришлось выполнить настройку devkit дважды:

cd C:/Ruby193-devkit
ruby dk.rb init
# Edit config.yml to remove all but Ruby193
ruby dk.rb install

cd C:/Ruby200-devkit
ruby dk.rb init
# Edit config.yml to remove all but C:/Ruby200
ruby dk.rb install

На данный момент я должен был бежать gem install json —platform=ruby успешно, но получил ошибку выше. Немного покопавшись, я обнаружил это, что советует проверить, что COMSPEC настроен корректно, и удалить все ключи автозапуска из HKEY_CURRENT_USER\Software\Microsoft\Command Processor - У меня был один из ANSIcon и должным образом удалил его.

К сожалению, я все еще не смог установить драгоценный камень JSON.

Затем меня поразило, что, возможно, неверная версия GCC использовалась или не была найдена. Две версии Devkit поставляются с разными версиями gcc:

> C:\Ruby193-devkit\mingw\bin\gcc —version
gcc (tdm-1) 4.5.2

> C:\Ruby200-devkit-x32\mingw\bin\gcc —version
gcc (rubenv-4.7.2-release) 4.7.2

Затем я подумал, не загружает ли pik версию devtools (и, следовательно, gcc) для конкретной версии ruby, которую я выбрал, и всегда использовал 1.9.3. Благодаря этой статье кажется, что это не так:

> pik use 193
> where ruby
C:\Ruby193\bin\ruby.exe

> cat C:\Ruby193\lib\ruby\site_ruby\devkit.rb
# enable RubyInstaller DevKit usage as a vendorable helper library
unless ENV['PATH'].include?('C:\\Ruby193-devkit\\mingw\\bin') then
  puts 'Temporarily enhancing PATH to include DevKit...'
  ENV['PATH'] = 'C:\\Ruby193-devkit\\bin;C:\\Ruby193-devkit\\mingw\\bin;' + ENV['PATH']
end
ENV['RI_DEVKIT'] = 'C:\\Ruby193-devkit'
ENV['CC'] = 'gcc'
ENV['CXX'] = 'g++'
ENV['CPP'] = 'cpp'


> pik use 200
> where ruby
C:\Ruby200\bin\ruby.exe

> cat C:\Ruby200\lib\ruby\site_ruby\devkit.rb
# enable RubyInstaller DevKit usage as a vendorable helper library
unless ENV['PATH'].include?('C:\\Ruby200-devkit-x32\\mingw\\bin') then
  phrase = 'Temporarily enhancing PATH to include DevKit...'
  if defined?(Gem)
    Gem.ui.say(phrase) if Gem.configuration.verbose
  else
    puts phrase
  end
  puts "Prepending ENV['PATH'] to include DevKit..." if $DEBUG
  ENV['PATH'] = 'C:\\Ruby200-devkit-x32\\bin;C:\\Ruby200-devkit-x32\\mingw\\bin;' + ENV['PATH']
end
ENV['RI_DEVKIT'] = 'C:\\Ruby200-devkit-x32'
ENV['CC'] = 'gcc'
ENV['CXX'] = 'g++'
ENV['CPP'] = 'cpp'

(На самом деле у меня нет кота на окнах, но для более ясного объяснения)

Как вы можете видеть, похоже, что правильная версия devkit добавляется к пути с помощью devkit.rb, который, очевидно, загружается, потому что моя ошибка содержит "Временное расширение PATH для включения DevKit…".

Вернуться к исходной ошибке

Это было:

The system cannot find the path specified.
Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...
The system cannot find the path specified.
ERROR:  Error installing json:
    ERROR: Failed to build gem native extension.

    C:/Ruby193/bin/ruby.exe extconf.rb
creating Makefile


Gem files will remain installed in C:/Ruby193/lib/ruby/gems/1.9.1/gems/json-1.8.1 for inspection.
Results logged to C:/Ruby193/lib/ruby/gems/1.9.1/gems/json-1.8.1/ext/json/ext/generator/gem_make.out

К сожалению, журнал результатов не очень помогает. Вот как выглядит gem_make.out:

C:/Ruby193/bin/ruby.exe extconf.rb
creating Makefile

я думал так extconf.rb может предложить какую-то помощь, но я не могу сделать ни голову, ни хвост:

require 'mkmf'

unless $CFLAGS.gsub!(/ -O[\dsz]?/, ' -O3')
  $CFLAGS << ' -O3'
end
if CONFIG['CC'] =~ /gcc/
  $CFLAGS << ' -Wall'
  unless $DEBUG && !$CFLAGS.gsub!(/ -O[\dsz]?/, ' -O0 -ggdb')
    $CFLAGS << ' -O0 -ggdb'
  end
end

$defs << "-DJSON_GENERATOR"
create_makefile 'json/ext/generator'

Makefile в C:/Ruby193/lib/ruby/gems/1.9.1/gems/json-1.8.1/ext/json/ext/generator выглядит так Мне кажется странным, что этот Makefile даже создается.

Если кто-то с немного большим опытом работы с Windows/Ruby сможет пролить свет на это, это было бы удивительно!

PS. Я на Windows 7 Professional SP1

Обновление после еще нескольких копаний

Поэтому я хотел проверить, что devkit вызывающе улучшает путь с помощью правильных каталогов devkit. Благодаря предложению из другого SO вопроса, я переместил установки devkit в каталоги Ruby:

Тдм девкит сейчас живет в C:\Ruby193\devkit в то время как mingw64 живет в C:\Ruby200\devkit, Запустив ruby dk.rb install -f для каждого devkit я открывал оба файла devkit.rb, чтобы проверить, что путь был обновлен правильно. У них было, и я обновил путы, чтобы он вывел "Временное улучшение PATH включает DevKit для 1.9" или "Временное улучшение PATH включает DevKit для 2". В качестве подтверждения, что загружается правильный devkit:

C:\>pik 193

C:\>ruby -rdevkit -ve "puts ENV['PATH']"
ruby 1.9.3p484 (2013-11-22) [i386-mingw32]
Temporarily enhancing PATH to include DevKit for 1.9...
C:\Ruby193\devkit\bin;C:\Ruby193\devkit\mingw\bin;C:\bin;C:\Ruby193\bin;C:\windows;C:\windows\system32;C:\windows\system32\Wbem;c:\Program Files (x86)
\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\;C:\Pro
gram Files (x86)\Common Files\Roxio Shared\DLLShared\;C:\Program Files\Java\jdk1.6.0_33\bin;C:\Program Files (x86)\Common Files\Apple\Mobile Device Su
pport\;C:\Program Files (x86)\Common Files\Apple\Apple Application Support;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Program Files\TortoiseSVN\bin
;C:/inpath;C:\Program Files (x86)\WinMerge;C:\ChromeDriver;C:\Program Files\WIDCOMM\Bluetooth Software\;C:\Program Files\WIDCOMM\Bluetooth Software\sy
swow64

C:\>pik 200

C:\>ruby -rdevkit -ve "puts ENV['PATH']"
ruby 2.0.0p353 (2013-11-22) [i386-mingw32]
Temporarily enhancing PATH to include DevKit for 2...
C:\Ruby200\devkit\bin;C:\Ruby200\devkit\mingw\bin;C:\bin;C:\Ruby200\bin;C:\windows;C:\windows\system32;C:\windows\system32\Wbem;c:\Program Files (x86)
\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\;C:\Pro
gram Files (x86)\Common Files\Roxio Shared\DLLShared\;C:\Program Files\Java\jdk1.6.0_33\bin;C:\Program Files (x86)\Common Files\Apple\Mobile Device Su
pport\;C:\Program Files (x86)\Common Files\Apple\Apple Application Support;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Program Files\TortoiseSVN\bin
;C:/inpath;C:\Program Files (x86)\WinMerge;C:\ChromeDriver;C:\Program Files\WIDCOMM\Bluetooth Software\;C:\Program Files\WIDCOMM\Bluetooth Software\sy
swow64

Так что все выглядит так, как будто работает правильно. но:

C:\>gem install json --platform=ruby
Temporarily enhancing PATH to include DevKit for 2...
Building native extensions.  This could take a while...
The system cannot find the path specified.
ERROR:  Error installing json:
        ERROR: Failed to build gem native extension.

    C:/Ruby200/bin/ruby.exe extconf.rb
creating Makefile


Gem files will remain installed in C:/Ruby200/lib/ruby/gems/2.0.0/gems/json-1.8.1 for inspection.
Results logged to C:/Ruby200/lib/ruby/gems/2.0.0/gems/json-1.8.1/ext/json/ext/generator/gem_make.out

C:\>pik 193

C:\>gem install json --platform=ruby
Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...
The system cannot find the path specified.
ERROR:  Error installing json:
        ERROR: Failed to build gem native extension.

    C:/Ruby193/bin/ruby.exe extconf.rb
creating Makefile


Gem files will remain installed in C:/Ruby193/lib/ruby/gems/1.9.1/gems/json-1.8.1 for inspection.
Results logged to C:/Ruby193/lib/ruby/gems/1.9.1/gems/json-1.8.1/ext/json/ext/generator/gem_make.out

Это ясно говорит нам о двух вещах:

  1. Когда я использую ruby ​​1.9, загружается какой-то другой файл devkit.rb, так как сообщение "для 1.9" не печатается.
  2. Это вряд ли будет реальной проблемой, так как ошибка одинакова в любом случае.

Я собираюсь посмотреть, смогу ли я собрать вручную, используя сгенерированные файлы Makefile.

7 ответов

Так что это не лучший ответ в мире, но я, похоже, наткнулся на решение. Если я установлю подробный флаг, все будет работать нормально:

gem install json --platform=ruby --verbose

Здесь есть журнал: http://gist.github.com/dannysmith/8055495

Это не имеет смысла - было бы здорово, если бы кто-то мог объяснить, почему это, похоже, исправило ошибку. Возможно, это ошибка в devkit?

У меня установлен gem json с версиями 1.8.1, но я не смог решить эту проблему для json 1.6.1, используя

gem install json --platform=ruby --verbose

Итак, я попробовал отсюда https://github.com/oneclick/rubyinstaller/issues/184

gem update --system 2.0.3

И после этого

gem install json -v 1.6.1 --platform=ruby --verbose

Это решает проблему, специфичную для json 1.6.1 для Win 7(64 бит) машины

Попробуйте запустить командную строку в режиме администратора. Примерно через 7-10 часов я понял это...

Убедитесь, что установленная вами версия ruby ​​(32- или 64-разрядная) соответствует версии DevKit. Им обоим должно быть 32 или 64 года, и это была моя проблема. Может быть, это не совсем та проблема, но я подумал, что я это выброшу. Вот сообщение, которое стоит проверить:

Rails на windows - установить вопрос

Установить 32-битную версию на Windows...

ver
windows 6.1.76011

64 бит выдал сообщение об ошибке о make-файле и заголовках. Перепробовал все другие предложения, в том числе на rubyinstaller о COMSPEC и реестре, добавлении gcc в path и другие. Некоторые гемы будут установлены, но git_fame и json не будут так необходимы для компиляции.

Редактировать: похоже, git_fame использует mimer_plus. mimer_plus предполагает использование инструментов GNU (инструменты Unix). Похоже, вам нужно сначала установить mingw. Это не было четко указано на странице rubyinstaller.

Как я это исправил:

  1. Скачал последний установщик ruby ​​с https://rubyinstaller.org/downloads/
  2. Запустил установщик, следуя инструкциям по установке зависимостей.
  3. Перезагрузил мой компьютер.
  4. Добавил каталог ruby ​​/bin в мою PATH.

У меня такая же проблема. Я использовал PowerShell, чтобы проверить мой путь

ps> $s = $env: путь

ps> $s.split("{;}")

Конечно, мой Рубин Mingw не был в пути. У меня в пути был ruby ​​\bin, но mingw\bin находился в другой папке. Я пошел в мой путь к среде и добавил его, и моя установка работала.

Другие вопросы по тегам