npm 脚本挂钩多个脚本

问题描述 投票:0回答:1

我有一个关于预脚本挂钩的相当简单的问题。

在我的 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
    }
}

有没有更有效的方法来完成此任务,或者我必须像我已经在做的那样做吗?

感谢您的宝贵时间! :)

angular npm hook package.json
1个回答
0
投票

我想扩展上面@pqnet 的评论:

package.json 脚本并不适合做复杂的事情......

如有必要,请多读几遍这句话。像 grunt 和 gulp 这样的工具很好,但我发现它们给本应相当简单的过程增加了很多不必要的复杂性。你现在所做的还不错,因为很清楚正在发生什么。我完全理解你的心情:

当我由于某种原因必须更改命令时,我必须为存储库中的每个项目(大约 5 个项目)执行 20 次。

但是,更新一堆脚本可以是简单的查找/替换,一年只发生几次。一般来说,我可以非常肯定地说,您不想在 npm 脚本的运行方式中引入任何“魔法”。出于以下几个原因,即使是内置的前/后挂钩也是一个坏主意:

  • 当您的脚本调用其他脚本而其他脚本调用其他脚本并且其中一些脚本具有前/后挂钩时,它会造成很多混乱 - 很难看到正在发生的事情的全貌,并且您花费大量时间试图弄清楚列出事情的正确顺序。一旦你弄清楚了这一切,那么当你出城时,你团队中的另一个人就会把它搞砸,没有人能弄清楚如何解决它(这发生在我身上......它很糟糕)。
  • 有时您不希望钩子运行...您该如何处理?更多 CLI 选项?呃,不,谢谢!
  • 有些单词实际上以字母“pre”或“post”开头...当您有“prepoulate”或“postfix”等脚本时,事情会变得非常混乱...然后有人定义了一个名为“的脚本”填充”或“修复”,却没有意识到它们正在激活一些不需要的“魔法”(这之前也发生在我身上 - 很糟糕)。
  • 还有其他原因可以避免“魔法”......我建议你用谷歌搜索一下。我几年前就停止使用前/后钩子,并且从未后悔过。

几乎在我开发过的每个应用程序中,我最终都需要运行大量与您正在做的类似的脚本......特别是当我开始使用 monorepos 并管理具有复杂构建的复杂项目时。在这种情况下,我创建实际的 JS/TS 文件并使用代码管理复杂性 - 它更容易阅读,并且更容易组成复杂的管道。我知道这不是你想听到的……我相信我会得到一些反对票,但我强烈建议你不要陷入钩子陷阱。

如果您决定采纳我的建议,我会定期使用一些工具来让我的生活更轻松:

  • tsx - 在 TS 中编写脚本并使用
    npx tsx <path_to_file>
    执行它们。
  • zx - 从 JS/TS 执行 bash 命令
  • commander - 将您的脚本变成带有选项和子命令的受人尊敬的 CLI 工具
  • 提示 - 通过提示用户提供附加信息来增强您的 CLI

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.