- PVSM.RU - https://www.pvsm.ru -
Команда «npm install» в менеджере пакетов npm [1] чаще всего употребляется для локальной установки зависимостей некоторого модуля, совершаемой в его подкаталоге «/node_modules».
Однако возможен и запуск этой команды с ключом «-g» (от слóва «global»). Он обеспечивает установку указанного ей пакета в некоторое глобальное (то есть общее для всей системы) место. Кроме того, в PATH (для последующего запуска из любого желаемого каталога) оказывается прописанною та команда, которая была указана в свойстве «"bin"» в файле package.json у установленного пакета.
Таким общим местом, согласно документации [2], под Windows служит подкаталог «/node_modules» в каталоге установки Node. В остальных же системах таким общим местом чаще всего оказывается каталог «/usr/local/lib/node_modules» (тогда как Node там устанавливается в каталог «/usr/local/bin»).
Обыкновенно этот подход употребляется для глобальной установки различных утилит, предназначенных для употребления из командной строки. Вот некоторые примеры:
Однако на CLI (на командной строке) свет клином не сошёлся — и читателям Хабрахабра должно уж вполне быть известно, что приложение на языке JavaScript, употребляющее API Node.js, можно снабдить и GUI (графическим интерфейсом пользователя), сочинённым на языках HTML и CSS. Для этого придётся и запускать такое приложение вместо Node на том движке, который до прошлого года назывался node-webkit, а в нынешнем (2015) году оказался 14 января переименованным [6] в nw.js.
Ваши GUI-приложения также могут глобально быть установлены в системе из npm-пакета при помощи npm. Давайте поговорим об этом.
Первый шаг ваш понятен: непременно понадобится засунуть в npm-пакет исходный код самогó вашего GUI-приложения, и засунете.
Однако для запуска этого кода потребуется также движок nw.js, а вот его-то помещать в тот же пакет не слишком разумно. Во-первых, объём движка (под Windows составляющий более 80 мегабайтов, например) создаёт угрозу чрезмерной нагрузки на репозиторий npm-пакетов, если засовывать движок в каждый такой пакет. Во-вторых, в зависимости от системы (Windows, Linux, Mac OS X) или от её разрядности (32-разрядная или 64-разрядная) движок должен быть другим — если же засовывать в npm-пакет все шесть возможных версий движка, то тогда не только репозиторий, но и конечный пользователь вздрогнет от суммарного объёма, достигающего без мáлого половины гигабайта.
Для преодоления этой проблемы был создан npm-пакет nw [7], который GUI-приложение может указать в числе своих зависимостей (в разделе «"dependencies"» в файле package.json) — и когда этот пакет будет установлен, то запустится определённый в его собственном файле package.json скрипт postinstall [8], который автоматически скачает из Интернета именно ту версию nw.js, которая сгодится для конкретной конечной операционной системы.
Следует заметить ещё, что пакет nw определяет [9] (в свойстве «"bin"» в файле package.json) ещё и команду «nw»; следовательно, GUI-приложение может [10] указать эту команду в качестве собственного скрипта "start", после чего запустить GUI-приложение можно будет, подав команду «npm start» в его каталоге.
Но сразу видно, что это не самый удобный способ запуска GUI-приложения. Куда удобнее было бы обеспечить возможность его запуска командою, состоящею из одного слóва (названия приложения) вместо двух, и притом из любого каталога. Выше ужé было сказано, что этой цели приложение может достигнуть, если в его файле package.json значением поля «"bin"» будет некоторый скрипт — тогда npm во время глобальной установки автоматически поместит этот скрипт в PATH и придаст ему желаемое название. Ну а пакет nw экспортирует [11] метод «.findpath()», которым скрипт может воспользоваться, выясняя конкретное местонахождение скачанного движка nw.js (для последующего запуска движка).
Для примера укажу, что в моём браузере гипертекстового векторного Фидонета [12] открытый исходный код такого скрипта выглядит вот как [13]:
#!/usr/bin/env node
require('child_process').spawn(
require('nw').findpath(),
['.'].concat( process.argv.slice(2) ),
{
cwd: __dirname,
detached: true,
stdio: 'ignore'
}
).unref();
Нетрудно видеть, что в нём нет ровным счётом ничего специфически фидонетовского. Следовательно, этот же пример все вы можете без малейших изменений использовать в собственных GUI-приложениях, если предполагаете глобальную установку их из npm-пакета.
Непременно обратите внимание на следующие фрагменты этого примера:
Рассмотренный выше подход может также быть применён и к установке приложений, вместо nw.js использующих более ранний движок node-webkit. Для этой цели вместо npm-пакета nw [7] следует использовать более ранний (и притом неофициальный) npm-пакет — nodewebkit [14].
Автор: Mithgol
Источник [15]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/path/84534
Ссылки в тексте:
[1] npm: https://www.npmjs.com/
[2] документации: https://docs.npmjs.com/files/folders#prefix-configuration
[3] JSHint: http://jshint.com/
[4] Browserify: http://browserify.org/
[5] Less.js: http://lesscss.org/
[6] переименованным: https://groups.google.com/forum/#!msg/nwjs-general/V1FhvfaFIzQ/720xKVd0jNkJ
[7] nw: https://www.npmjs.com/package/nw
[8] postinstall: https://github.com/nwjs/npm-installer/blob/fc294eda2f4b74107c841cded1db6c30a9282c98/package.json#L14
[9] определяет: https://github.com/nwjs/npm-installer/blob/fc294eda2f4b74107c841cded1db6c30a9282c98/package.json#L11
[10] может: https://github.com/nwjs/npm-installer/blob/fc294eda2f4b74107c841cded1db6c30a9282c98/README.md#usage
[11] экспортирует: https://github.com/nwjs/npm-installer/blob/fc294eda2f4b74107c841cded1db6c30a9282c98/README.md#finding-the-path-to-the-nwjs-binary
[12] гипертекстового векторного Фидонета: http://habrahabr.ru/post/225395/
[13] вот как: https://github.com/Mithgol/phido/blob/581967ba3d64944b94f9365eb0d437dda128a5e7/phido.js
[14] nodewebkit: https://www.npmjs.com/package/nodewebkit
[15] Источник: http://habrahabr.ru/post/252029/
Нажмите здесь для печати.