npm install如果package.json被修改了。

11 浏览
0 Comments

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已被修改?

0