"Не удалось создать собственное расширение 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
Это ясно говорит нам о двух вещах:
- Когда я использую ruby 1.9, загружается какой-то другой файл devkit.rb, так как сообщение "для 1.9" не печатается.
- Это вряд ли будет реальной проблемой, так как ошибка одинакова в любом случае.
Я собираюсь посмотреть, смогу ли я собрать вручную, используя сгенерированные файлы 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 года, и это была моя проблема. Может быть, это не совсем та проблема, но я подумал, что я это выброшу. Вот сообщение, которое стоит проверить:
Установить 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.
Как я это исправил:
- Скачал последний установщик ruby с https://rubyinstaller.org/downloads/
- Запустил установщик, следуя инструкциям по установке зависимостей.
- Перезагрузил мой компьютер.
- Добавил каталог ruby /bin в мою PATH.
У меня такая же проблема. Я использовал PowerShell, чтобы проверить мой путь
ps> $s = $env: путь
ps> $s.split("{;}")
Конечно, мой Рубин Mingw не был в пути. У меня в пути был ruby \bin, но mingw\bin находился в другой папке. Я пошел в мой путь к среде и добавил его, и моя установка работала.