Using npm to globally install nw.js-based GUI applications
- Tutorial
Team « npm the install » in the manager package npm most often used for the local installation of the dependencies of a module made in its sub-directory «/ node_modules».
However, it is possible to run this commandwith the “ -g ” switch (from the word “global”). It provides the installation of the package specified by it in some global (that is, common for the whole system) place. In addition, PATH (for later launch from any desired directory) is spelled out is the team that has been specified in the property « " bin directory " » in the file package.json have installed package.
According to the documentation , such a common place under Windows is the subdirectory“/ node_modules” in the Node installation directory. In other systems, such a common place is most often the directory “/ usr / local / lib / node_modules” (whereas Node is installed there in the directory “/ usr / local / bin”).
Usually this approach is used for the global installation of various utilities designed to run from the command line. Here are some examples:
However, the wedge did not converge on the CLI (on the command line) - and Habrahabr readers should already be well aware that a JavaScript application using the Node.js API can also be equipped with a GUI (graphical user interface) composed in HTML and CSS . And it will have to run this application instead of the Node on the engine, which until last year was callednode-webkit , and this year (2015) was proved to be 14 January renamed in nw.js .
YourGUI applications can also be globally installed on the system from an npm package using npm. Let's talk about it.
Your first step is clear: you will certainly need to put itin an npm package the source code of your own GUI application, and stick it.
However, to run this code, you will also needthe nw.js engine, but putting it in the same package is not very reasonable. Firstly, the volume of the engine (for Windows, which is more than 80 megabytes, for example) poses a threat of excessive load on the npm-package repository if you insert the engine into each such package. Secondly, depending on the system (Windows, Linux, Mac OS X) or on its bit capacity (32-bit or 64-bit), the engine should be different - if you put it in an npm package all six possible versions of the engine, then not only the repository, but also the end user will start from the total volume, which reaches without a small half a gigabyte.
To overcome this problem the developers was creatednpm-pack nw , which is GUI-application can specify among its dependencies (see « " dependencies " » in the file package.json ) - and when this package is installed, it starts a certain in his own file package.json script a postinstall , which will automatically download from the Internet is the version nw.js, which will work for a specific end-system.
It should be noted also that the package nw determines (in the property« " bin directory " » in the file package.json ) is also a command «nw»; therefore, the GUI application can specify this command as its own "start" script , after which it will be possible to start the GUI application by issuing the " npm start " command in its directory.
But you can see right away that this is not the most convenient way to launch aGUI application. It would be much more convenient to ensure the possibility of its launch by a command consisting of one word (application name) instead of two, and, moreover, from any directory. Uzhé above it it was said that the purpose application can be achieved if its file package.json field value « " bin directory " » will be some script - then npm during the global settings are automatically put this script in your PATH, and give it the name you want. Well, the nw package exports the “ .findpath () ” method , which the script can use to find out the specific location of the downloaded nw.js engine (for subsequent launch of the engine).
For example, I’ll indicate that as part of my browserHypertext vector Fidonet open source code of such a script looks likethis :
It is easy to see that there is absolutely nothing specifically fidonetovskogo in it. Therefore, you can use the same example all without the slightest changes in your ownGUI applications if you intend to install them globally from an npm package.
Be sure to pay attention to the following snippets of this example:
The above approach can also be applied to installing applications,instead of nw.js using the earlier node-webkit engine . For this purpose, instead of the npm nw package , you should use the earlier (and, moreover, unofficial) npm package - nodewebkit .
However, it is possible to run this command
According to the documentation , such a common place under Windows is the subdirectory
Usually this approach is used for the global installation of various utilities designed to run from the command line. Here are some examples:
- The
“ npm install jshint -g ” command ensures thatthe “jshint” command appears on the PATH, which is used to startJSHint .
- The
“ npm install browserify -g ” command ensures thatthe “browserify” command appears on the PATH, which serves to launchBrowserify .
- Team
« npm the install less See -g » provides the appearance to the PATHcommand «lessc», which is used to runLess.js .
However, the wedge did not converge on the CLI (on the command line) - and Habrahabr readers should already be well aware that a JavaScript application using the Node.js API can also be equipped with a GUI (graphical user interface) composed in HTML and CSS . And it will have to run this application instead of the Node on the engine, which until last year was called
Your
Your first step is clear: you will certainly need to put it
However, to run this code, you will also need
To overcome this problem the developers was created
It should be noted also that the package nw determines (in the property
But you can see right away that this is not the most convenient way to launch a
For example, I’ll indicate that as part of my browserHypertext vector Fidonet open source code of such a script looks like
#!/usr/bin/env node
require('child_process').spawn(
require('nw').findpath(),
['.'].concat( process.argv.slice(2) ),
{
cwd: __dirname,
detached: true,
stdio: 'ignore'
}
).unref();
It is easy to see that there is absolutely nothing specifically fidonetovskogo in it. Therefore, you can use the same example all without the slightest changes in your own
Be sure to pay attention to the following snippets of this example:
- “ Detached: true ”
and “ .unref () ”: the nw.js engine starts as a separate process, and the start command finishes its work immediately (does not wait for it);
“ Cwd: __dirname ”: the nw.js engine starts working in the directory where npm globally installed the start command (assuming that the entireGUI application is in the same place; but if you put this code not next to thepackage file.json , as I did, and in some subdirectory, then add the output from the subdirectory to the parent directory on this line);
“ ['.']. Concat (process.argv.slice (2)) ": the nw.js engine at the command line first receives a period (an instruction to take the application to be launched from the current directory), and then all the command line parameters of the start command;
“ #! / Usr / bin / env node ”: under Windows this line may not seem necessary, however this impression is illusory (actually npm relies on the presence of this line).
The above approach can also be applied to installing applications,