@Interface

Как правильно устанавливать node аддоны с нативным кодом?

Проблемма всплывает каждый раз, когда я пытаюсь установить нестандартный (непопулярный) модуль для node/io.js.

Суть ее проста: я пишу (windows 7 x64)
npm install smth

а консоль мне вываливает ошибки - я иду смотреть какие зависимости указаны у этого модуля на github'е, пытаюсь их исправить - ошибки все равно остаются.

Описание, конечно, очень сумбурное и создает впечатление, что у меня просто кривые руки.. но нельзя это делать как-то проще?
Может есть какой то аналог npm решающий проблемы зависимостей для нативных модулей?
Или возможно такой, что отдавал бы бинарники?

Из-за того что я пытался решить эту проблемму, на основной системе возникла некоторая каша из Visual Studi'й разных версий, поэтому чтобы избежать лишних ошибок из-за этого, я решил перенести процесс установки аддонов на виртуальную машину. Т.е. план такой:
  • на основной машине потребовался нативный модуль
  • иду на виртуальную, устанавливаю модуль, он компилится. У меня есть бинарники этого модуля
  • тащу их на основную машину


для этого у меня сейчас есть:
VMWare, на котором:
  • Windows XP x32 (выбрана как менее прожорливая)
  • io.js (потому что node не захотела запусктаься, утверждая что она не х32 приложение)
  • node-gyp
  • Visual studio C++ 2010 express
  • Python 2.7.9


Однако все это по прежнему для меня не работает при установке текущего расширения, а именнно : https://github.com/mikeseven/node-glfw

Действовал опять таки согласно инструкциям на приведенной странице, но попытки заканчиваются:
... много ошибок...
.\src\glfw.cc(82): error C3861: 'NewSymbol': identifier not found [C:\Document
and Settings\user\1\node_modules\node-glfw\build\glfw.vcxproj]

... много ошибок ...

C:\Documents and Settings\user\1\node_modules\node-glfw\node_modules\nan\nan.h(
746): error C3861: 'NewSymbol': identifier not found [C:\Documents and Settings
\user\1\node_modules\node-glfw\build\glfw.vcxproj]
C:\Documents and Settings\user\1\node_modules\node-glfw\node_modules\nan\nan.h(
750): error C2039: 'NewSymbol' : is not a member of 'v8::String' [C:\Documents
and Settings\user\1\node_modules\node-glfw\build\glfw.vcxproj]

... много ошибок ...

(могу предоставить весь вывод если нужно)


Кто-нибудь может что-то посоветовать?
Быть может мне нужна Win7/8?
Студия 2013?
Какие либо альтернативы npm/node-gyp?
Может нужно использовать именно node.js и iojs - не вариант?
Может лучше уйти на линукс?
Возможно ли из под линукса кросскомпилить модули установленные из npm так, что б их можно было запустить на win?
(Насколько я помнимаю это можно сделать редактуруя binding.gyp)
В любом случае то, что я хочу сделать должно работать в windows.
Может ничего и не должно компилироваться из-за багов и это норма?

Если кто-то захочет помочь решить проблемму так сказать своими руками - могу предоставить доступ (teamviewer) к этой виртуальной машине.
  • Вопрос задан
  • 3245 просмотров
Пригласить эксперта
Ответы на вопрос 3
По поводу рабочего окружения:
Я бы порекомендовал уйти от Win XP хотя бы на Win 7. Из личного опыта - если вдруг у вас возникнет проблема с установкой модуля на Win XP никто даже не почешется помочь вам с отладкой.
Так же я порекомендовал бы Visual Studio 2010 или 2013. Здесь в большинстве случаев разницы не будет. После выбора используемой версии советую прописать npm config set msvs_version 2013 (или 2010 соответственно)
Стоит ознакомиться с рекомендациями приведенными в инструкции по работе с node-gyp

Установка нативых модулей в iojs это отдельная песня. Шанс что они скомпилируются как подмодули какого-то проекта нулевой, поскольку node-gyp не умеет компилировать под iojs, потому что не знает откуда качать его исходники. Поэтому Вам скорее всего придется устанавливать эти модули отдельно, компилировать их, а потом кидать в папку проекта.
Для компиляции используйте npm install -g pan-gyp. Это форк node-gyp созданный специально для компиляции под iojs. Собственно для компиляции модуля:
1. берем его с гитхаба
2. в package.json в секцию scripts прописываем preinstall: pan-gyp rebuild. (В случае модуля с которым вы мучаетесь, перезаписываем сразу install script)
3. Из директории модуля запускаем npm install .

У некоторых нативных модулей действительно есть скомпилированные бинарники, но это целиком ответственность разработчика модуля. И ответственность притом не малая. В случае вашего модуля, такие бинарники отсутствуют. Чаще всего при наличии бинарников у модуля в зависимостях будет висеть node-pre-gyp. (Примеры v8-profiler, v8-debug).
К слову для приведенных примеров вам совершенно необязательно что-либо перезаписывать.
Эти два модуля являются подмодулями node-inspector и в большинстве случаев устанавливаются без проблем.

В заключении:
Если не хотите вздрагивать при появлении в зависимостях проекта нативных модулей, то советую действительно использовать nodejs, так как компиляция под iojs еще очень не стабильна в плане инструментов.

Модуль, с которым вы мучаетесь, скорее всего вообще не тестировался на iojs.
Так же обратите внимание на package.json engine в этом пректе.
Ответ написан
Scorpi
@Scorpi
Я тоже долго мучался с этим проблемой, самая стабильная связка с которой компилится почти всё:
Visual Studio 2013 Community Edition, (Пробовал 2015, приходится фиксить кучу кода самостоятельно)
Python 2.7
node v0.12.3 (именно node, с iojs много проблем несовместимости)
Windows 8.1 (Но я думаю и на Win 7 всё будет ОК)

А в GLFW надо скопировать какие то либы (надеюсь вы увидели это на GitHub):
Copy all deps/.lib into your /VC/lib for 32-bit libraries, 
and /VC/lib/amd64 for 64-bit libraries. Copy all deps/.dll into /System32.
Ответ написан
@postepenno
Постоянно мучался с этой проблемой на Windows. Помогла глобальная установка модуля windows-build-tools:
https://github.com/felixrieseberg/windows-build-tools
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы