关于预脚本挂钩,我有一个相当简单的问题。
在我的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脚本并不适合做复杂的事情。。。
如果必须的话,把这句话读几遍。像咕哝和吞咽这样的工具很好,但我发现这些工具给本应相当简单的过程增加了很多不必要的复杂性。你目前所做的还不错,因为很清楚发生了什么。我完全理解你的感受:
当我出于某种原因不得不更改命令时,我必须为repo中的每个项目(大约5个项目(更改20次。
然而,更新一堆脚本可以是一个简单的查找/替换,每年只发生几次。总的来说,我可以非常明确地说,你不想引入任何";魔术;npm脚本的运行方式。即使是内置的前/后挂钩也是个坏主意,原因有几个:
- 当你有调用其他脚本的脚本,而其中一些脚本有前/后挂钩时,会造成很多混乱——很难看到正在发生的事情的全貌,而且你花了很多时间试图弄清楚事情的正确顺序。一旦你弄清楚了一切,然后你团队中的另一个人来了,在你不在城里的时候把它搞砸了,没有人能想出如何解决它(这以前发生在我身上……太糟糕了(
- 有时你不想让钩子跑。。。你怎么做的?更多CLI选项?Yuk,不,谢谢
- 有些单词实际上以字母"开头;预";或";张贴";。。。当你有诸如";前置";或";后缀";,然后有人后来定义了一个名为"的脚本;填充";或";"修复";而没有意识到它们正在激活一些不需要的"信号";魔术;(这种事以前也发生在我身上——糟透了(
- 还有其他的原因可以避免";魔术";。。。我建议你在谷歌上搜索一下。我几年前就停止使用前/后挂钩了,从来没有后悔过
在我开发过的几乎每一个应用程序中,我最终都需要运行许多与您正在做的类似的脚本。。。尤其是当我开始使用monoreos和管理复杂构建的复杂项目时。在这种情况下,我会创建实际的JS/TS文件,并用代码管理复杂性——它更容易阅读,也更容易组成复杂的管道。我知道这不是你想听的。。。我相信我会得到一些反对票,但我强烈建议你不要陷入陷阱。
如果你决定接受我的建议,我会定期使用一些工具来让我的生活更轻松:
- tsx-在TS中编写脚本并使用
npx tsx <path_to_file>
执行它们 - zx-从JS/TS执行bash命令
- commander—将您的脚本变成一个具有选项和子命令的受人尊敬的CLI工具
- 提示-通过提示用户提供其他信息来增强CLI
希望能有所帮助。