【问题标题】:What exactly does 'npm install -g ' do?'npm install -g' 到底是做什么的?
【发布时间】:2015-12-22 03:51:55
【问题描述】:

我想使用 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 中的所有I found 的东西都是关于 JavaScript 的。

npm install 是做什么的?在我看来,它应该只启动一些下载过程。

【问题讨论】:

    标签: node.js npm sinopia


    【解决方案1】:

    npm install &lt;package&gt;npm install -g &lt;package&gt;

    1. 下载您使用参数指定的 npm 包,或在您的 package.json 文件中,连同它的依赖项(来自您定义的 npm 存储库主机)在 node_modules 文件夹中。 (或者使用它已经存在的本地副本。见shrink-wrapping

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

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

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

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

    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 文档说“安装,安装后:安装包后运行。”。 “已安装软件包”是什么意思?我认为安装包等于“下载包”?对吗?
    • 那种。 npm 不会自动下载包的任何依赖项,因为您最终会拥有一个无限长的依赖项树。它将收缩包装模块的依赖关系。确认依赖、定位正确版本并将其与模块挂钩的过程就是安装过程。 “安装”和“安装后”脚本允许您在安装模块时/之后对模块执行某些操作。它只是在这个过程的某些关键时刻执行脚本的一个钩子。
    【解决方案2】:

    npm install -g 中的 g 是一个标志,表示您要在系统范围内(全局)安装该特定 npm 模块。如果没有 g 选项,模块将安装在本地名为 node_modules 的当前目录中 - 试试吧!

    全局安装包的位置可能会因安装节点的方式而异。通过在命令行中键入 npm list -g 找出它们的安装位置。

    edit:您的错误可能是由于您的 npm 根目录中的权限不足引起的,但也可能是该库不支持您使用的节点版本。检查您需要运行crypt3node 的哪个版本,并确保您的节点版本与该版本匹配(node -v)。如果与要求的版本不匹配,可以使用nvm等节点版本管理器切换到该版本,然后再次尝试npm install

    【讨论】:

      【解决方案3】:

      npm install -g &lt;package-name&gt; 尝试将包安装到系统范围的 node_modules 目录中(对于 Mac,这将是 "/usr/local/lib/node_modules"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-08
        • 1970-01-01
        • 2021-07-05
        • 2016-04-19
        • 1970-01-01
        • 2021-11-26
        • 2012-05-19
        • 1970-01-01
        相关资源
        最近更新 更多