首页 > 解决方案 > 如何在当前工作空间的上下文中设置的 npm@^7.0.0 monorepo 中执行嵌套的“npm 运行命令”?

问题描述

我有一个 monorepo,里面有几个工作区。对我来说,使用链式 npm 脚本来执行简单任务而不是使用任务运行器是很常见的。因此,例如,以下配置(伪代码)对我来说非常常见并且也很有用,特别是对于构建前和构建后的脚本

"scripts": {   
    "prebuild:task1":"task1 --task1-arguments",  
    "prebuild:task2":"task2 --task2-arguments",  
    "prebuild": "npm run prebuild:task1 && npm run prebuild:task2",   
    "build":"build-script --build-arguments",  
}

因此,上面是子工作区本身的 package.json,然后在主 package.json 中,我调用了触发该工作区构建的脚本。

build:packageA: "npm run build -w packageA"

一切似乎都运行良好,但工作空间内的链式“npm 运行脚本”实际上是在主 monorepo 的上下文中执行的,而不是在该特定工作空间内。

因此,总而言之,第一个调用是在工作区中运行构建脚本,然后触发该工作区的预构建脚本,但是当该脚本执行链式 npm 运行脚本时,这些脚本在主存储库的上下文中运行,而这些脚本发生在它们不那里不存在。所以调用堆栈可能是......

(master) build:packageA
(packageA) prebuild
(master) npm run prebuild:task1 >>>> 退出错误

到目前为止,我发现绕过这个问题的唯一方法是让我的子工作区成为一个本身持有零工作空间的 monorepo。本质上,我的 package.json 中有一个“workspaces”键,指向根目录。这使我能够在脚本部分使用 -w 标志,以便将所有脚本引用到它自己。所以我目前的解决方法看起来像这样......

"workspaces": ["."],  
"scripts": {  
   "prebuild:task1":"task1 --task1-arguments",  
   "prebuild:task2":"task2 --task2-arguments",  
   "prebuild": "npm run prebuild:task1 -w packageA && npm run prebuild:task2 -w packageA",   
   "build":"build-script --build-arguments -w packageA"  
}

不是已经有更好的方法来解决这个问题了吗?在此先感谢大家!

标签: npmpackage.jsonnpm-scriptsmonorepo

解决方案


在这篇文章https://stackoverflow.com/a/67060676之后,我发现它npm改变了它在工作区中调用嵌套脚本的方式。

我在运行时遇到了类似的问题npm@7.5,但该功能是在npm@7.7中引入的。将 node 更新到 v17 并将 npm 更新到 8.3 导致一切都按预期运行。

就我而言,我想npm run build在工作区中执行嵌套命令。


推荐阅读