我有一个关于预脚本挂钩的相当简单的问题。
在我的 package.json 中,我有几个命令,它们都应该运行相同的预脚本。我已经有办法做到这一点,但我想知道是否有更有效的方法。
当前实施情况
{
"scripts": {
"myproject:run": "npm run custom.prescript && ng serve ...",
"myproject:prod": "npm run custom.prescript && ng serve -env=prod ...",
"myproject:build.devserver": "npm run custom.prescript && ng build -env=dev ...",
...
"myproject:build.prodserver": "npm run custom.prescript && ng build -env=prod ...",
"custom.prescript": "..."
}
}
这一切都很好,但我希望有一种更简洁的方法来实现它,因为我有大约 20 个这样的脚本需要相同的预脚本。当我由于某种原因必须更改命令时,我必须为存储库中的每个项目(大约 5 个项目)执行 20 次。
我知道有一种方法可以通过创建具有相同名称和前缀“pre”的脚本来添加前脚本,以确保它在特定脚本之前运行,但据我所知,这不适用于多个脚本知道。
我的目标示例
{
"scripts": {
"myproject:run": "ng serve ...",
"myproject:prod": "ng serve -env=prod ...",
...
"secondproject:run": "ng serve ...",
"secondproject:prod": "ng serve -env=prod ...",
...
"premyproject:*": "...", // Runs before all 'myproject:*' scripts
"presecondproject:*": "..." // Runs before all 'secondproject:*' scripts
}
}
有没有更有效的方法来完成此任务,或者我必须像我已经在做的那样做吗?
感谢您的宝贵时间! :)
我想扩展上面@pqnet 的评论:
package.json 脚本并不适合做复杂的事情......
如有必要,请多读几遍这句话。像 grunt 和 gulp 这样的工具很好,但我发现它们给本应相当简单的过程增加了很多不必要的复杂性。你现在所做的还不错,因为很清楚正在发生什么。我完全理解你的心情:
当我由于某种原因必须更改命令时,我必须为存储库中的每个项目(大约 5 个项目)执行 20 次。
但是,更新一堆脚本可以是简单的查找/替换,一年只发生几次。一般来说,我可以非常肯定地说,您不想在 npm 脚本的运行方式中引入任何“魔法”。出于以下几个原因,即使是内置的前/后挂钩也是一个坏主意:
几乎在我开发过的每个应用程序中,我最终都需要运行大量与您正在做的类似的脚本......特别是当我开始使用 monorepos 并管理具有复杂构建的复杂项目时。在这种情况下,我创建实际的 JS/TS 文件并使用代码管理复杂性 - 它更容易阅读,并且更容易组成复杂的管道。我知道这不是你想听到的……我相信我会得到一些反对票,但我强烈建议你不要陷入钩子陷阱。
如果您决定采纳我的建议,我会定期使用一些工具来让我的生活更轻松:
npx tsx <path_to_file>
执行它们。希望有帮助。