- PVSM.RU - https://www.pvsm.ru -

Использование npm для глобальной установки приложений, наделённых GUI и основанных на nw.js

Использование npm для глобальной установки приложений, наделённых GUI и основанных на nw.js - 1Команда «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»).

Обыкновенно этот подход употребляется для глобальной установки различных утилит, предназначенных для употребления из командной строки. Вот некоторые примеры:

  • Команда «npm install jshint -g» обеспечивает появление в PATH команды «jshint», служащей для запуска JSHint [3].
     
  • Команда «npm install browserify -g» обеспечивает появление в PATH команды «browserify», служащей для запуска Browserify [4].
     
  • Команда «npm install less -g» обеспечивает появление в PATH команды «lessc», служащей для запуска Less.js [5].

Использование npm для глобальной установки приложений, наделённых GUI и основанных на nw.js - 2Однако на 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-пакета.

Непременно обратите внимание на следующие фрагменты этого примера:

  • «detached: true» и «.unref()»: движок nw.js запускается в качестве отдельного процесса, а стартовая команда завершает свою работу тотчас же (не ждёт его);
     
  • «cwd: __dirname»: движок nw.js начинает работу в том каталоге, куда npm глобально установил стартовую команду (исходя из предположения о том, что и всё GUI-приложение лежит там же; но если этот код вы положили не рядом с файлом package.json, как сделал я, а в некотором подкаталоге, то добавьте в этой строке выход из подкаталога в родительский каталог);
     
  • «['.'].concat( process.argv.slice(2) )»: движку nw.js в командной строке сперва передаётся точка (указание взять запускаемое приложение из текущего каталога), а затем — все параметры командной строки стартовой команды;
     
  • «#!/usr/bin/env node»: под Windows эта строка может показаться не нужною, однако это впечатление иллюзорно (на самом деле 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/