Короче говоря, проблема
Я нахожусь в 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 Installer в
C:/Ruby193
- Ruby 2.0.0p353 с Ruby Installer в
C:/Ruby200
- Devkit
DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe
(для ruby 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 выглядит так:
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
. Другими словами, pik отлично работает.
Devkit предназначен, чтобы разрешить компиляцию собственных двоичных файлов C/С++ из драгоценных камней в Windows, чтобы avio использовала предварительно скомпилированные двоичные файлы 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 установлен корректно и удаляет любые ключи AutoRun из HKEY_CURRENT_USER\Software\Microsoft\Command Processor
- у меня был один из ANSIcon и должным образом удалил его.
К сожалению, я все еще не смог установить json gem.
Тогда мне показалось, что, возможно, неправильная версия 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:
Теперь tdm devkit живет в C:\Ruby193\devkit
, а mingw64 - C:\Ruby200\devkit
. Запустив ruby dk.rb install -f
для каждого devkit, я открыл оба файла devkit.rb, чтобы проверить правильность обновления пути. У них было, и я обновил puts, чтобы он напечатал: "Временное повышение 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
Это ясно говорит нам о двух вещах:
- Некоторые другие файлы devkit.rb загружаются, когда я использую ruby 1.9, так как сообщение "для 1.9" не печатается.
- Это вряд ли будет реальной проблемой, так как ошибка одинакова в любом случае.
Я посмотрю, смогу ли я создать вручную, используя сгенерированные файлы Makefile.