SQLite и NW.js — пошаговая инструкция для создания крепкой дружбы

Привет, Хабр и его обитатели! Захотелось изваять нечто на 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 — это беты, альфы и ночные сборки.

Хотя, как любой недоучка сделал все наполовину и следующую рекомендацию на выполнил:

Рекомендация из документации для 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 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 на гуглоДиске

FavoriteLoadingДобавить в избранное
Posted in Без рубрики

Добавить комментарий