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

时间:2020-08-10 23:43:17

标签: npm npm-install

我可以确定软件包安装的本地依赖项。但是现在我非常担心本地安装的软件包是否可以安装其他全局软件包作为依赖项。

例如:

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

1 个答案:

答案 0 :(得分:0)

不可能在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(本地)可以在我不知道的情况下安装全局软件包吗?

这不是完全沉默。为上述npm i文件运行package.json时,您将看到以下输出:

> 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时是否会抓住这一点仍有待商