“npm install -g”做了什么?

13

我想使用sinopia搭建一个私有的npm仓库,我执行了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有关。 npm install是做什么的?在我看来,它应该只是启动一些下载过程。
4个回答

13

npm install <package>npm install -g <package> 将会:

  1. 下载你指定的 npm 包及其依赖项(从你定义的 npm 仓库托管)到 node_modules 文件夹中,使用参数或在 package.json 文件中指定。(或者使用已经存在的本地副本,参见 shrink-wrapping

  2. 为这个包及其每个依赖项运行 pre-installinstallpost-install 脚本。参见 Lifecycle Scripts

  3. -g 选项告诉 npm 在全局共享的 node_modules 文件夹中安装包(通常是 node 所在的位置)。这也允许你从命令行访问模块,因为 bin 已经在 PATH 文件夹中建立了符号链接(通常是 usr/local/bin)。请查看这个链接

对于 sinopia,它们没有标准的 package.json 文件,而是有一个 package.yaml 文件。请检查 yamp 插件

如果你查看它们的 pre-publish 脚本,你会发现它包含

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,postinstall:在包被安装后运行”。这里的“包被安装”是什么意思?我认为“包被安装”等同于“包被下载”,对吗? - liam xu
有点像。npm不会自动下载任何包的依赖项,因为这样你最终会得到一个无限长度的依赖树。它将为模块收缩依赖项。确认依赖关系、定位正确版本并将其与模块连接起来的过程就是安装过程。"安装"和"后安装"脚本允许您在模块被安装时/之后对其进行操作。这只是在此过程的某些关键时刻执行脚本的钩子。 - Ludovic C

10
npm install -g中,g是一个标志,表示您想要全局安装该特定的npm模块系统。如果没有g选项,该模块将在当前目录内的node_modules文件夹下局部安装 - 试试看吧!
全局安装包的位置取决于您如何安装Node.js。通过在命令行中输入npm list -g来查找它们被安装在哪里。
编辑:您可能遇到了权限不足的错误,但也有可能是因为您正在使用的Node.js版本不支持该库所需的版本。检查您需要运行crypt3node版本,并确保您的Node.js版本与其匹配(node -v)。如果不匹配所需版本,则可以使用像nvm这样的Node.js版本管理器切换到该版本,并再次尝试npm install

4

npm install -g <package-name> 会尝试将包安装到系统范围内的 node_modules 目录中(Mac 上为 "/usr/local/lib/node_modules"


0

npm i -g <package-name> 中的 g 标志表示,您不必再次安装特定的软件包,因为它只成为节点的共享模块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接