Привет, Хабр и его обитатели! Захотелось изваять нечто на HTML и JS, чтобы было десктопное и удобное. Что для этого нужно? Правильно. Node.js и NW.js или Electron. Поглядев на слабые попытки холивара NW vs Electron и почитав документацию и того и другого было принято решение для начала пощупать NW.js.
Но вот ведь засада. Выполнение 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 — это беты, альфы и ночные сборки.
Хотя, как любой недоучка сделал все наполовину и следующую рекомендацию на выполнил:
<npm-path>node_modulesnode-gypsrcwin_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
Далее — качаем 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:Python27Scripts;
C:Windowssystem32;
C:Windows;
C:WindowsSystem32Wbem;
C:WindowsSystem32WindowsPowerShellv1.0;
C:Program Filesnodejs;
C:UsersDenAppDataRoamingnpm;
C:Program FilesMicrosoft Visual Studio2017CommunityMSBuild15.0Bin;
C:Program FilesMSBuildMicrosoft.Cppv4.0v140;
Выделенное жирным шрифтом — то, что необходимо добавить вручную. Естественно, убедившись, что эти пути существуют.
Обязательный пункт — перезагрузка.
Ну и теперь собственно сборка. Я пользовался менеджером 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.
Ну собственно и всё. Если все сделано правильно, то сборка проходит с некоторым количеством сообщений типа
..srcdatabase.cc(672): warning C4996: 'Nan::MakeCallback': объявлен deprecate [C:appnode_modulessqlite3buildnode_sqlite3.vcxproj]
C:appnode_modulesnannan.h(929): note: см. объявление "Nan::MakeCallback"
c:appnode_modulesnannan_new.h(208): warning C4244: аргумент: преобразование "sqlite3_int64" в "double", возможна потеря данных (компилируется исходный файл ..srcdatabase.cc) [C:appnode_modulessqlite3buildnode_sqlite3.vcxproj]
но в итоге модуль собирается и располагается в
C:/app/node_modules/sqlite3/lib/binding/node-webkit-v0.32.1-win32-ia32node_sqlite3.node
Нюанс сборки — при каждой сборке папка node_modules/sqlite3/lib удаляется сборщиком. Поэтому, если есть необходимость собрать два модуля (для каждой архитектуры) — сохраняйте промежуточный результат.
Спасибо за внимание, напоследок результат эксперимента:
Собранные модули для NW.js 0.32.1 ia32 && x64 на гуглоДиске
Автор: marsdenden