【发布时间】:2019-02-27 05:19:42
【问题描述】:
TL;DR:如果您的 package.json 已被修改,有没有办法让 npm install 在运行任何 npm 脚本之前自动运行?
问题场景
您拉取或签出更新了package.json 的分支。你运行npm run my-script。 my-script 依赖于新添加到 package.json 的包。 my-script 失败。你想知道为什么。在翻转你的桌子之前,你运行npm install 只是为了确定。 my-script 运行成功。你不需要一张新桌子。
我知道像gradle 这样的构建/任务运行工具会在运行任务之前确保您的依赖项是最新的。我一直是npm 不这样做的(次要)痛点。我偶然发现了两个我不太喜欢的解决方案。
非理想解决方案:make
您可以使用 make 并通过以下技巧利用其集成的依赖跟踪,而不是依赖 package.json 中的 npm 脚本来运行命令:
# Smart install: Only executes if package.json's
# modification date is later than node_module's
node_modules: package.json
npm install
@rm -f node_modules/.modified
@touch -m node_modules/.modified
install: node_modules
来源:https://mattandre.ws/2016/05/make-for-hipsters/
问题是你知道必须依赖 make 来运行脚本,而失去了 npm 脚本的某些优势,例如方便地引用其他脚本和并行运行脚本 (npm-run-all)。如果他们不知道make 或在运行它时遇到问题(Windows),与其他人一起工作也会更加困难。它是 node/npm 生态系统之外的一个过时工具,而且对于这种智能安装优势而言成本太高。
非理想解决方案:Git 挂钩
另一种方法是添加post-merge git hook。
问题是这个解决方案是存储库本地的,不能轻易共享。 npm install 只会在 git 合并时自动运行。当您以任何其他方式更改package.json 时,您仍然必须记住运行npm install。诚然,这在实践中只是一个小问题。尽管如此,当您想要运行脚本时,完全不必考虑运行 npm install 会很好。
来源:https://davidwalsh.name/git-hook-npm-install-package-json-modified
理想的解决方案
我想以类似于以下方式定义我的package.json:
{
"scripts": {
"pre-run": "npm-smart-install",
"my-script": "…"
},
"dependencies": {
"npm-smart-install": "1.0.0"
}
}
npm-smart-install 是一个我希望存在的假设 npm 包。 pre-run 是一个假设的 npm-scripts 生命周期钩子。当我运行npm run my-script 并且package.json 自上次运行任何脚本以来已被修改时,请在运行my-script 之前运行npm install。
重复一遍:如果您的 package.json 已在不依赖 npm 生态系统之外的工具的情况下被修改,有没有办法让 npm install 在运行任何 npm 脚本之前自动运行?
【问题讨论】:
-
您自己的假设包可能并不难实现。您可以在第一次安装时生成
package.json的哈希摘要,然后在后续安装中使用它来检查文件是否更改。 This 看起来有类似的功能。 -
另外,为什么不在任何脚本之前运行
npm install?如果一切都存在正确的版本,那么它不会做任何事情。 -
这会延迟每个脚本的运行。
-
这听起来像是NPM's tink 希望解决的问题(尽管那是几年之后的事了)。
-
我的包裹快用完了。试图弄清楚我如何像在理想的解决方案场景中那样执行它。
标签: javascript node.js npm package.json