Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What exactly does 'npm install -g ' do?

I want to set up a private npm registry using sinopia and I executed npm install -g sinopia, but some error message occurred:

> [email protected] install /usr/local/lib/node_modules/sinopia/node_modules/crypt3
> node-gyp rebuild

gyp WARN EACCES user "root" does not have permission to access the dev dir "/root/.node-gyp/4.2.3"
gyp WARN EACCES attempting to reinstall using temporary dev dir "/usr/local/lib/node_modules/sinopia/node_modules/crypt3/.node-gyp"
make: Entering directory `/usr/local/lib/node_modules/sinopia/node_modules/crypt3/build'
  CXX(target) Release/obj.target/crypt3/crypt3.o
In file included from ../crypt3.cc:7:0:
../node_modules/nan/nan.h:261:25: error: redefinition of âtemplate<class T> v8::Local<T> _NanEnsureLocal(v8::Local<T>)â
 NAN_INLINE v8::Local<T> _NanEnsureLocal(v8::Local<T> val) {
                         ^
../node_modules/nan/nan.h:256:25: error: âtemplate<class T> v8::Local<T> _NanEnsureLocal(v8::Handle<T>)â previously declared here
 NAN_INLINE v8::Local<T> _NanEnsureLocal(v8::Handle<T> val) {
                         ^
../node_modules/nan/nan.h:661:13: error: ânode::smallocâ has not been declared
     , node::smalloc::FreeCallback callback
             ^

I can see the .h files which relate to C or C++; how come this happens? All the stuff I found within sinopia is about JavaScript.

What does npm install do? In my opinion, it should only initiate some download process.

like image 370
liam xu Avatar asked Dec 22 '15 03:12

liam xu


2 Answers

npm install -g <package-name> attempts to install the package into a system-wide node_modules directory (for Mac, this would be "/usr/local/lib/node_modules")

like image 72
robert Avatar answered Oct 20 '22 17:10

robert


npm install <package> or npm install -g <package> will

  1. Download an npm package you specify with the argument, or inside your package.json file, along with its dependencies (from the npm repository host you define) inside a node_modules folder. (Or use an already existing local copy of it. see shrink-wrapping)

  2. Run the pre-install, install and post-install scripts for itself and each of its dependencies. See Lifecycle Scripts

  3. The -g directive tells npm to install the package in the global shared node_modules folder (usually where node is). This will also allow you to access the module from the command-line, as the bin is symlinked into a PATH folder (usually usr/local/bin). Check this link

In the case of sinopia, they do not have a standard package.json file, they have a package.yaml file. Check the yamp plugin.

If you check their pre-publish script, it contains

prepublish: js-yaml package.yaml > package.json

Which converts their package.yaml into package.json. In their package.json, they have a dependency on the crypt3 package.

In the case of crypt3 (one of sinopia dependencies), check the package.json . It contains

  "scripts": {
    "test": "node test/test.js",
    "install": "node-gyp rebuild"
  },

So, when sinopia is npm installed, it will download and install all if its dependencies as well. When crypt3 is installed, the "node-gyp rebuild" will be run, which is why you are seeing native c / c++ compile outputs in your console.

You can try it yourself by doing

npm install -g node-gyp && node-gyp rebuild

In the console

like image 42
Ludovic C Avatar answered Oct 20 '22 17:10

Ludovic C