“npm install -g”到底做了什么?

我想用sinopiabuild立一个私人的npmregistry,并执行'npm install -g sinopia'。 但是一些错误信息发生在下面。

> crypt3@0.1.8 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 ^ 

我可以看到与C或C ++相关的.h文件,因为我发现sinopia中的所有东西都是关于javascript的,所以会怎么样呢? 这是gitbhub的位置。 https://github.com/rlidwka/sinopia

所以我想知道'npm install'做什么,因为我认为它只做一些下载过程。

非常感谢。

npm install <package>或者npm install -g <package>

  1. 在node_modules文件夹内下载一个你用参数指定的npm软件包,或者在你的package.json文件中,以及它的依赖关系(来自你定义的npm版本库主机)。 (或使用它的一个已经存在的本地副本,请参阅收缩包装 )

  2. 为自身和每个依赖项运行pre-installinstallpost-install脚本。 请参阅生命周期脚本

  3. -g指令告诉npm将程序包安装在全局共享的node_modules文件夹中(通常是节点所在的位置)。 这也将允许您从命令行访问模块,因为bin被链接到一个PATH文件夹(通常是usr / local / bin)中。 检查这个链接

在sinopia的情况下,他们没有一个标准的package.json文件,他们有一个package.yaml文件。 检查yamp插件 。

如果您检查他们的预发布脚本,它包含

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

它将package.yaml转换成package.json。 在他们的package.json中,他们依赖crypt3包。

在crypt3(sinopia依赖项之一)的情况下,检查package.json 。 它包含

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

所以,当sinopia安装npm时,它会下载并安装所有依赖关系。 安装crypt3时,将会运行“node-gyp rebuild”,这就是为什么你在控制台上看到原生c / c ++编译输出的原因。

你可以亲自尝试一下

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

在控制台中

npm install -gg是一个标志,表示您要在系统范围(全局)安装特定的npm模块。 没有g选项,模块将被安装在名为node_modules -try it的当前目录中。

全局安装的软件包的位置可能会有所不同,具体取决于您安装节点的方式。 通过在命令行中inputnpm list -g来查找它们的安装位置。

编辑:你的错误可能是由于你的npm根目录的特权不足造成的,但也可能是你所使用的节点版本不被该库支持。 检查你需要运行crypt3哪个版本的node ,并确保你的节点版本匹配( node -v )。 如果与所需版本不匹配,则可以使用节点版本pipe理器(如nvm)切换到该版本,然后再次尝试npm install

npm install -g <package-name>尝试将软件包安装到系统范围的node_modules目录(对于Mac,这将是"/usr/local/lib/node_modules"