Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accessing a node.js global module

Tags:

node.js

The npm documentation says this:

  • If you’re installing something that you want to use in your program, using require('whatever'), then install it locally, at the root of your project.
  • If you’re installing something that you want to use in your shell, on the command line or something, install it globally, so that its binaries end up in your PATH environment variable.

I am currently writing --- or, at least, trying to write --- a genuine command line program in node that's intended to be used from the shell. Therefore, according to the above, my dependencies should be installed as global modules.

How do I actually use a global module installed with npm in node? Calling require() doesn't work, of course, because the npm global module directory (/usr/local/lib/node_modules) isn't on the path by default. I can make it working by explicitly adding it to the path at the top of my program, but that's a really lousy solution because it's not portable --- it requires knowledge of where the npm's global module directory is on any given system.

Just to make life even more aggravating, I have some global modules installed via dpkg. These have been put in /usr/lib/nodejs, and they just work. This confuses me, because if global modules aren't supposed to be used for ordinary applications I would expect neither to be on the path; or else I would expect them both to be on the path and requiring global modules to just work everywhere. Having one but not the other seems very odd. What's going on here?

Update: I should point out that this program is just a script, with #!/usr/bin/env nodejs at the top; it's not a formal node module, which is way overkill for something quite this trivial. As the Debian modules are all requireable from such a script, it seems sensible to me that npm's global modules should be requireable too, but I have a feeling that this is a Debianism...

like image 449
David Given Avatar asked Sep 25 '12 14:09

David Given


People also ask

Where can I find globally installed node modules?

Path of Global Packages in the system: Global modules are installed in the standard system in root location in system directory /usr/local/lib/node_modules project directory. Command to print the location on your system where all the global modules are installed.

What is global module in node JS?

Global modules are node packages that are installed on your system rather than your project directory. They allow us to use the package as a tool anywhere on the local computer. By saying global, we are talking about the scope of usage of these modules.

How node js modules are available externally?

js Package Manager (npm) is the default and most popular package manager in Node. js ecosystem that is primarily used to install and maintain external modules in Node. js application. Users can basically install the node modules needed for their application using npm.


2 Answers

Therefore, according to the above, my dependencies should be installed as global modules.

Not quite.

It meant that your module could be installed as a global so its binaries would be available from the shell:

npm install -g your-module
your-module-binary --option etc.

Its dependencies, on the other hand, should be installed following the 1st point, residing in a node_modules directory within your project (generally specified in a package.json so npm can manage them).

But, global modules aren't (normally) available for require. They don't follow Loading from node_modules folders, which npm follows for local modules, and their path isn't typically listed in the NODE_PATH variable for Loading from global folders.

like image 82
Jonathan Lonowski Avatar answered Sep 27 '22 16:09

Jonathan Lonowski


So the instructions you have pertain to npm modules, but you are doing local development. Here are some guidelines.

In terms of your source code, you only need 2 types of require statements

var dep = require('somedep')

Use this for any core modules (like fs) and third party modules your library needs that you are including via npm (listing them in your package.json as dependencies). Here you specify an unqualified package name and node finds the module according to its search algorithm.

var mymod = require('./lib/mymod')

Use this for requiring the other modules in your project itself by path relative to the current javascript file.

That's all you have to do to handle your javascript dependencies.

OK, now how do you install your dependencies?

For local development (within your project's source tree), just cd into the project directory and run npm install, which will read your package.json file and install the modules you need in the node_modules subdirectory and all will be well for local development.

If you were to actually publish this as an npm module, other users (and you can be both the developer and one of the "other users"), could install it with npm -g if they wanted to access your project's binary utilities on their PATH which would need to include /usr/lib/nodejs/lib/node_modules, but in that case, the npm -g will handle installing both your code and your project's dependencies all at once.

Here's where you are getting confused.

Therefore, according to the above, my dependencies should be installed as global modules.

You don't need to explicitly install dependencies as globals, only the top-level module you are interested in, which in this case is your project itself. npm will handle the dependencies automatically, which is its primary purpose in life. Your project's dependencies won't be installed globally per say, but rather in the node_modules subdirectory of your project, which WILL be installed globally.

Here's the directories and what lives there:

  • ~/yourproject: local development for your source code
  • ~/yourproject/node_modules: npm modules used by your project during development. Created/populated by running npm install in ~/yourproject
  • /usr/lib/nodejs/lib/node_modules: npm modules (which could eventually include yourproject if you publish it to the npm registry) that are installed globally
  • /usr/lib/nodejs/lib/node_modules/yourproject/node_modules: your project's dependencies will get installed here when you do npm install -g yourproject

You may also find my blog post on managing interpreters and the PATH relevant.

like image 41
Peter Lyons Avatar answered Sep 27 '22 17:09

Peter Lyons