Привет, Хабр и его обитатели! Захотелось изваять нечто на HTML и JS, чтобы было десктопное и удобное. Что для этого нужно? Правильно. Node.js и NW.js или Electron. Поглядев на слабые попытки холивара NW vs Electron и почитав документацию и того и другого было принято решение для начала пощупать NW.js.
Но вот ведь засада. Выполнение
Итак. Для начала была собрана машина «из того что было» и установлена Windows 7 x32 с пакетом .NET 4.7.1 (потребуется для Visual C++). Почему 32 бита? Решил начать с малого. Хотя, как оказалось, создание модуля под x64 не требует исполнения на x64 системе.
Затем был поставлен Node.js версии 10.8.0 Хотя на момент окончания экспериментов уже появилась 10.9.0. Но тут я решил послушать знающих людей:
Поразмышляв, решил, что делаю все-таки для LTS, хотя не совсем понятно, где у них у всех LTS, а где нет. Предположил, что non-LTS — это беты, альфы и ночные сборки.
Хотя, как любой недоучка сделал все наполовину и следующую рекомендацию на выполнил:
Для ноды ставим (крайне необходимо делать из командной строки с правами администратора)
Далее — качаем Visual Studio Community Edition (текущая ссылка легко находится в любимом поисковике) — на момент написания статьи текущая версия 2017. Что для нас немаловажно — она содержит в себе Build Tools 2015 — пока нативные модули в ноде собираются только с этой версией и более свежих не поддерживают. Скачиваем инсталлятор, запускаем и ставим одну галочку в закладке «Отдельные компоненты» — Набор инструментов VC++ 2015.3 v14.00 (v140) для ПК
Добавившийся Windows 8.1 SDK также необходим, поэтому устанавливаем все три пункта. Установка в данном виде приводит к скачке 2,89 гигабайт всякого нужного.
Едем дальше — качаем змейку. Причем версии 2.7. Устанавливаем, по умолчанию в C:\Python27.
А теперь — внимание! Засада.
Инсталлятор по умолчанию считает, что необязательно добавлять в PATH расположение питончика, поэтому устраняем это недоразумение на этапе установки
Похожая засада преследует многих разработчиков при сборке самых разных модулей для ноды. А все потому, что мелкомягкая корпорация также не считает нужным прописывать пути к своим творениям. Гитхаб просто завален ошибками сборки из-за того, что после установки в PATH не попадают пути к сборочным инструментам. Исправляем и это недоразумение — правим переменную среды, чтобы она позволяла сборке пройти если и не очень гладко, то хотя бы без ошибок. Вот что получилось у меня (разбил на строки для лучшего восприятия)
Выделенное жирным шрифтом — то, что необходимо добавить вручную. Естественно, убедившись, что эти пути существуют.
Обязательный пункт — перезагрузка.
Ну и теперь собственно сборка. Я пользовался менеджером FAR, но никто не запрещает и олдскульный cmd
для x64 меняем --target_arch=x64.
Ну собственно и всё. Если все сделано правильно, то сборка проходит с некоторым количеством сообщений типа
но в итоге модуль собирается и располагается в
Нюанс сборки — при каждой сборке папка node_modules/sqlite3/lib удаляется сборщиком. Поэтому, если есть необходимость собрать два модуля (для каждой архитектуры) — сохраняйте промежуточный результат.
Спасибо за внимание, напоследок результат эксперимента:
Собранные модули для NW.js 0.32.1 ia32 && x64 на гуглоДиске
Но вот ведь засада. Выполнение
npm i sqlite3
устанавливает только те библиотеки, которые могут исполняться при непосредственном запуске через node. А если попытаться подключить скрипт в html и запустить этот html в NW.js, то ничего у нас не выйдет. Гугл сотоварищи выдает только один рецепт включения sqlite в проект на nw.js, да и тот приходится вытаскивать из кэша. Да и устарел он уже. Посему было потрачено пару дней на изучение проблематики и поиск рабочего решения. Прошу под кат.Итак. Для начала была собрана машина «из того что было» и установлена Windows 7 x32 с пакетом .NET 4.7.1 (потребуется для Visual C++). Почему 32 бита? Решил начать с малого. Хотя, как оказалось, создание модуля под x64 не требует исполнения на x64 системе.
Затем был поставлен Node.js версии 10.8.0 Хотя на момент окончания экспериментов уже появилась 10.9.0. Но тут я решил послушать знающих людей:
Поразмышляв, решил, что делаю все-таки для LTS, хотя не совсем понятно, где у них у всех LTS, а где нет. Предположил, что non-LTS — это беты, альфы и ночные сборки.
Хотя, как любой недоучка сделал все наполовину и следующую рекомендацию на выполнил:
Рекомендация из документации для LTS-releases
On Windows, you need to replace the file
<npm-path>\node_modules\node-gyp\src\win_delay_load_hook.cc with the one at github.com/nwjs/nw.js/blob/nw18/tools/win_delay_load_hook.cc before installing modules with node-gyp or npm.
Ну не нашел я этот файл у себя на компе. Наверное, потому что не ставил node-gyp.
<npm-path>\node_modules\node-gyp\src\win_delay_load_hook.cc with the one at github.com/nwjs/nw.js/blob/nw18/tools/win_delay_load_hook.cc before installing modules with node-gyp or npm.
Ну не нашел я этот файл у себя на компе. Наверное, потому что не ставил node-gyp.
Для ноды ставим (крайне необходимо делать из командной строки с правами администратора)
npm i -g nw-gyp
Собственно говоря, замена node-gyp
nw-gyp is a hack on node-gyp to support NW.js specific headers and libraries.
Далее — качаем Visual Studio Community Edition (текущая ссылка легко находится в любимом поисковике) — на момент написания статьи текущая версия 2017. Что для нас немаловажно — она содержит в себе Build Tools 2015 — пока нативные модули в ноде собираются только с этой версией и более свежих не поддерживают. Скачиваем инсталлятор, запускаем и ставим одну галочку в закладке «Отдельные компоненты» — Набор инструментов VC++ 2015.3 v14.00 (v140) для ПК
Добавившийся Windows 8.1 SDK также необходим, поэтому устанавливаем все три пункта. Установка в данном виде приводит к скачке 2,89 гигабайт всякого нужного.
Едем дальше — качаем змейку. Причем версии 2.7. Устанавливаем, по умолчанию в C:\Python27.
А теперь — внимание! Засада.
Инсталлятор по умолчанию считает, что необязательно добавлять в PATH расположение питончика, поэтому устраняем это недоразумение на этапе установки
Похожая засада преследует многих разработчиков при сборке самых разных модулей для ноды. А все потому, что мелкомягкая корпорация также не считает нужным прописывать пути к своим творениям. Гитхаб просто завален ошибками сборки из-за того, что после установки в PATH не попадают пути к сборочным инструментам. Исправляем и это недоразумение — правим переменную среды, чтобы она позволяла сборке пройти если и не очень гладко, то хотя бы без ошибок. Вот что получилось у меня (разбил на строки для лучшего восприятия)
>echo %PATH%
C:\Python27\;
C:\Python27\Scripts;
C:\Windows\system32;
C:\Windows;
C:\Windows\System32\Wbem;
C:\Windows\System32\WindowsPowerShell\v1.0\;
C:\Program Files\nodejs\;
C:\Users\Den\AppData\Roaming\npm;
C:\Program Files\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin;
C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\v140;
Выделенное жирным шрифтом — то, что необходимо добавить вручную. Естественно, убедившись, что эти пути существуют.
Обязательный пункт — перезагрузка.
Ну и теперь собственно сборка. Я пользовался менеджером FAR, но никто не запрещает и олдскульный cmd
c:\
md app
cd \app
npm init
npm install sqlite3 --build-from-source --runtime=node-webkit --target_arch=ia32 --target=0.32.1 --msvs_version=2015
для x64 меняем --target_arch=x64.
Ну собственно и всё. Если все сделано правильно, то сборка проходит с некоторым количеством сообщений типа
..\src\database.cc(672): warning C4996: 'Nan::MakeCallback': объявлен deprecate [C:\app\node_modules\sqlite3\build\node_sqlite3.vcxproj]
C:\app\node_modules\nan\nan.h(929): note: см. объявление "Nan::MakeCallback"
c:\app\node_modules\nan\nan_new.h(208): warning C4244: аргумент: преобразование "sqlite3_int64" в "double", возможна потеря данных (компилируется исходный файл ..\src\database.cc) [C:\app\node_modules\sqlite3\build\node_sqlite3.vcxproj]
но в итоге модуль собирается и располагается в
C:/app/node_modules/sqlite3/lib/binding/node-webkit-v0.32.1-win32-ia32\node_sqlite3.node
Нюанс сборки — при каждой сборке папка node_modules/sqlite3/lib удаляется сборщиком. Поэтому, если есть необходимость собрать два модуля (для каждой архитектуры) — сохраняйте промежуточный результат.
Спасибо за внимание, напоследок результат эксперимента:
Собранные модули для NW.js 0.32.1 ia32 && x64 на гуглоДиске