【问题标题】:Can "NPM -i" (local) install a global package without i know it?“NPM -i”(本地)可以在我不知道的情况下安装全局包吗?
【发布时间】:2020-11-30 14:36:10
【问题描述】:

我对安装包的本地依赖项没问题。但是现在我非常担心本地安装的包是否可以安装其他全局包作为依赖项。

例如:

npm install nunjucks npm 安装 sqlite 要么 npm install botkit

【问题讨论】:

    标签: npm npm-install


    【解决方案1】:

    无法在package.json 中将依赖项标记为全局,以便在运行npm i 时将其安装在系统范围内。

    an old comment by Isaac Schlueter 声明这永远不会实现。

    不过,编写一个预安装脚本来全局安装任意依赖项真的很简单。

    {
      "name": "Project",
      "version": "1.0.0",
      "description": "Preinstall script to install global deps",
      "main": "index.js",
      "scripts": {
        "preinstall": "node -e \"const {execSync} = require('child_process'); JSON.parse(fs.readFileSync('package.json')).globalDependencies.forEach(globalDep => execSync('npm i -g ' + globalDep));\""
      },
      "dependencies": {
        "react": "16.13.1"
      },
      "globalDependencies": [
        "lodash"
      ],
      "license": "ISC"
    }
    

    将此代码复制到 PC 文件夹中的 package.json 文件中。然后,在文件夹中运行npm i。它将在本地安装 React(在 node_modules 文件夹中),并将在全局安装 lodash。

    您可以使用以下方式验证这一点:npm i ls -g --depth=0

    参考:Install dependencies globally and locally using package.json

    关于你的问题:

    npm -i(本地)可以在我不知道的情况下安装全局包吗?

    它并非完全无声。为上述package.json 文件运行npm i 时,您将看到以下输出:

    > Project@1.0.0 preinstall /home/jim/Desktop/Project
    > node -e "const {execSync} = require('child_process'); JSON.parse(fs.readFileSync('package.json')).globalDependencies.forEach(globalDep => execSync('npm i -g ' + globalDep));"
    
    npm WARN Project@1.0.0 No repository field.
    
    audited 6 packages in 1.113s
    found 0 vulnerabilities
    

    但在大型项目上运行 npm i 时是否会发现这一点尚有争议。

    【讨论】:

      猜你喜欢
      • 2016-12-13
      • 1970-01-01
      • 2016-05-21
      • 1970-01-01
      • 2020-02-28
      • 2013-10-21
      • 2014-05-23
      • 2015-08-20
      相关资源
      最近更新 更多