【问题标题】:How to make a script run when using NPM commands?使用 NPM 命令时如何使脚本运行?
【发布时间】:2020-11-28 02:19:56
【问题描述】:

尝试在these instructions 之后将名为license-checkerscript 绑定到npm 命令我在package.json 中想出了这个sn-p

{
  "scripts": {
    "postinstall": "license-checker --json --out license-list.json",
    "poststart": "license-checker --json --out license-list.json"
  },

不起作用。手动运行命令会生成licence-list.json 文件,但在安装包时不会生成 (npm i package-name --save)。为什么不呢?

注意:当 (1) 将新包安装到项目中时,以及 (2) 构建项目以进行部署时,我正在尝试运行此脚本。但是,buildin the docs 没有任何意义:我可以使用 startpoststart 吗?如果没有,我可以使用什么来代替?

【问题讨论】:

  • 关于“在 (1) 将新包安装到项目中时运行此脚本” - 不幸的是,npm 确实提供了一个内置功能来实现这一点。如果您使用的是 *nix,请考虑在 shell 级别覆盖 npm install <pkg-name> --save 命令,如我的回答 here 中所述。

标签: npm


【解决方案1】:

根据 npm 文档 (https://docs.npmjs.com/misc/scripts),安装包时会调用 postinstall 脚本,因此调用时会调用 postinstall 脚本

npm install

当你调用时它不会被调用

npm i package-name --save

也许你可以在安装包后进行检查。

编辑:如果这样做的目的是检查添加到 package.json 中的内容,那么进行预提交检查/钩子可能是一个更好的主意,也就是使用 https://www.npmjs.com/package/husky 之类的东西

【讨论】:

  • 我确实想要 Git 挂钩,结果 Vue(我的应用程序是基于 Vue 的)本机包含对 Husky 的厌恶
【解决方案2】:

你可以试试hook-scripts

来自文档:

如果您想在特定生命周期事件中运行特定脚本 所有包,然后你可以使用钩子脚本。

将一个可执行文件放在node_modules/.hooks/{eventname},然后 当所有包通过该点时,它将为所有包运行 在该根目录中安装的任何包的包生命周期中。

Hook 脚本的运行方式与 package.json 脚本完全相同。 也就是说,它们在一个单独的子进程中,描述了 env 以上。

编辑

例子:

我在 Windows 10、Node 12.18.0 和 NPM 6.14.4 上试过这个

  1. 我在node_modules/.hooks/ 创建了一个bat 文件,内容如下:
call node -e "console.log('Hello, I got executed from .hooks folder.')"
  1. 然后跑npm i ng-bootstrap --save

钩子脚本被执行。检查下面的屏幕截图。

注意正如@RobC 所指出的,这个脚本将为正在安装的包的每个传递依赖项执行。

【讨论】:

  • 如果我理解正确this answer@RobC,这将不会在安装新的单个软件包时运行脚本
  • @drake035 不,它也会运行以安装单个软件包。我已经编辑了我的答案以显示我尝试过的示例。并且文档清楚地说明了If you want to run a specific script at a specific lifecycle event for ALL packages, then you can use a hook script.
  • @Smile - 我看到ng-bootstrap 在其package.jsondependencies 部分中没有定义任何内容,所以大概这就是您的 postinstall 脚本仅被调用的原因一次。但是,如果您运行; npm i eslint --save (注意:eslint 确实在其package.jsondependencies 部分列出了包) 然后大概你的 postinstall 脚本被多次调用,即它被调用对于安装的每个传递依赖项。
  • 这是否意味着您在声明无法将脚本绑定到单个软件包的安装@RobC 时是错误的?
  • @drake035 - 这取决于您对“个人包裹”的定义。假设您安装了一个软件包,例如通过运行npm i eslint --save 进行 eslint。我对您的要求的理解是,例如eslint(及其所有传递依赖项)已安装,您希望 postinstall 脚本在完成时运行一次。但是,由于 eslint 有多个传递依赖项(如您所见 here),您的 postinstall 脚本将运行多次,即它将在安装每个传递依赖项之后运行。试试看!
【解决方案3】:

我没有尝试过,但是您可以使用构建脚本在那里您可以按照您的目标使用您的命令。通过使用 && 运算符。 例如:

"build": "npm run compile && npm run theme:build && npm run webpack:admin",

你的情况是这样的:

"postinstall": "license-checker --json --out license-list.json",
"poststart": "license-checker --json --out license-list.json"
"build": "npm run poststart && npm run postinstall && npm run newpocket -save",

这并不是你想要的,而是一种制作方式。

【讨论】:

    猜你喜欢
    • 2017-05-10
    • 2019-08-18
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 2018-02-05
    • 2020-01-20
    相关资源
    最近更新 更多