Install private Node.js package
Published on: 13th May 2021
Overview
This article aims at showing how to develop a private Node.js package and then making it available in the console (i.e., make it a command line interface, CLI).
For example, you are working on a private project and you have developed some prototypes (in JS script file) which you do not want to include in the final output. In this case, you may want to create a CLI to copy the necessary project script files and skip those unnecessary files. This CLI is going to be helpful in reducing the chance of making mistakes by adding the unnecessary files.
Another example is to minify the client side JS script files.
Guideline
Let's create a directory called 'test-pkg'. In this directory, we create a new file called package.json
. You may use npm init
to create this file for you except that you need to set up the bin
section.
{
"name": "test-pkg",
"version": "1.0.0",
"private": true,
"description": "test-pkg",
"bin": {
"helowork": "./bin/index.js"
},
"author": "someone@yourdomain.com",
"license": "SEE LICENSE IN license.txt in celestial directory",
"dependencies": {}
}
The bin
section allows multiple commands. In our case, we are exposing helowork
only. In case you want to add another command, you will have to add another JS script file in the bin
directory. After that, add an entry to the bin
section (in the package.json
file).
The final directory structure will look like this:
- /test-pkg
|--/bin
|--/bin/index.js
|--/lib
|--/lib/helowork.js
|--package.json
Create a lib
directory under test-pkg
. You are advised to keep all the shared functions in this directory so that it won't clutter the bin
directory. Exposes the necessary key functions to bin/index.js
that is sufficient to run the process and keep the complex process details to itself.
Next, we will create a lib/helowork.js
file. This file has the following functions:
exports.sayHelo = function () {
console.log('this is Node.js');
console.log('HELO work @ ' + (new Date()).toString());
};
exports.sayMyName = function (name) {
console.log('HELO ' + name);
};
After that, create a bin
directory under test-pkg
and create a new file called bin/index.js
. This file contains the process to be executed with the command specified in the bin
section in package.json
.
For example, when the user types "helowork" in the console and press Enter key, Node.js will execute bin/index.js
script file for you. The shebang line (the first line that starts with '#' symbol) is for the Linux platform which informs the OS to run the script in Node shell.
#!/usr/bin/env node
const helowork = require('../lib/helowork');
// In process.argv[], the first item is Node.js executable.
// The second item is 'index.js' file name.
// Third item onwards is the user input.
if (process.argv.length > 2) {
// if the user passes in their name, it will call sayMyName().
helowork.sayMyName(process.argv[2]);
}
else {
// by default, this script will sayHelo().
helowork.sayHelo();
}
Finally, install this package without publishing it to NPM registry by running the following command (where test-pkg
is the directory name).
npm install test-pkg -g
Run the following command to view the list of global packages. With depth=0
, the result will hide the package dependencies.
npm ls --depth=0 -g
In my computer, I have the following result:
C:\Program Files\nodejs
...
+-- test-pkg@1.0.0 -> D:\test-pkg
...
Now, let's try these new commands in the console. In Windows platform, you may use either Powershell console or Command Prompt. Type the following command and press Enter:
helowork
And the following result will appear in the console. Since, this function prints the current date and time, you may expect different values when you run the command.
this is Node.js
HELO work @ Thu May 12 2021 11:33:22 GMT+0800 (Malaysia Time)
If you run helowork
with an argument, say 'Mike',
helowork Mike
The following result will appear:
HELO Mike
To remove the global package,
npm remove test-pkg -g
Notes on installing global package
-
Installing a package into global scope is meant for CLI (command line interface). It does not mean that you can
require
it in other projects. For more information, please refer to the following discussion thread. -
If you want to make this package available to other project (without publishing this package to npm),
- Add
main
section inpackage.json
.
"main": "./lib/helowork.js",
- After that, modify
$NODE_PATH
environment variable by adding your private package directory.
For more information, please refer to the following page and search for
$NODE_PATH
. - Add
Useful links
-
For more information on
npm install
, please visit the following page. -
The following link explains the
package.json
file in detail.
Jump to #NODEJS blog
Author
Lau Hon Wan, software developer.