npm install如果package.json被修改了。
npm install如果package.json被修改了。
问题场景:当你拉取或检出更新了package.json的分支时,运行npm run my-script。my-script依赖于新添加到package.json的包。my-script执行失败,你不知道原因。在翻桌子之前,你运行npm install以确保。my-script成功运行,你不需要新的桌子。
我知道像gradle这样的构建/任务运行工具会在运行任务之前确保你的依赖项是最新的。这一直是一个(次要的)痛点,npm不会这样做。我发现了两个解决方案,但我不是特别喜欢。
非理想解决方案:使用make
不要依赖于package.json中的npm脚本来运行命令,而是使用make并利用其集成的依赖跟踪,使用以下技巧:
# 智能安装:仅在package.json的修改日期晚于node_module时执行
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钩子。
问题是这个解决方案仅适用于存储库,并且不能轻松共享。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。
重申一遍:如果依赖于npm生态系统之外的工具,有没有办法在运行任何npm脚本之前自动运行npm install,如果package.json已被修改?