我正在尝试找出针对JavaScript monorepo的正确方法。想象一下包含软件包/库的monorepo:
root
- node_modules
- packages
+ lib-a
* node_modules
+ lib-b
* node_modules
现在假设lib-a
和lib-b
软件包都使用webpack
作为其构建工具。
我看到两种方法
添加wepback
作为对root的依赖。在两个软件包中都包含“ build”脚本:"build": "webpack -p --config webpack.config.js
。 webpack.config.js
可以包含根webpack.config.js
。然后,我可以使用诸如lerna
之类的工具从根目录运行构建(这意味着webpack
二进制文件可以被识别。但是由于webpack
不存在,因此我将无法在特定程序包中运行构建。我可能可以将构建脚本更改为类似"build": "../../node_modules/.bin/webpack -p --config webpack.config.js
每个软件包中始终包含webpack
。这意味着build
脚本将成功。这也意味着每个程序包都具有相同的依赖关系,我可能应该注意每个程序包都使用相同的webpack
版本。
基本上,我要讲的是monorepo内的软件包应该如何结构化?如果发布了任何软件包,是否总是有可能单独build
单独软件包。
答案 0 :(得分:2)
您的方法2是正确的。由于每个包装都是独立的独立包装,因此您需要分别处理。
monorepo的优势不在于通过目录结构共享文件,而在于:
node_modules
上,从而有效地对它们进行重复数据删除。import
/ require()
使软件包对其他软件包可用,因为它们是外部依赖项。而且,借助与node_modules
的符号链接,您的“依赖”包始终包含最新内容,而无需发布。我知道一开始并不容易,但是当您深入研究Lerna文档时,它变得更加清晰。除了Lerna main page外,我还建议您阅读hoisting,FAQ以及bootstrap和publish之类的单个命令。
答案 1 :(得分:0)
我们当前的配置与您相同:
root
- node_modules
- packages
+ lib-a
* node_modules
+ lib-b
* node_modules
我们使用 lerna 处理我们的项目:https://github.com/lerna/lerna
您只需要在lerna.json
{
"lerna": "3.16.4",
"packages": ["packages/*"],
"version": "0.0.0",
"npmClient": "yarn",
"useWorkspaces": true
}
然后在您的package.json
脚本中,您可以使用以下行:
"build": "lerna run build",
这基本上将在所有软件包中运行构建。因此,只要每个软件包中的构建脚本都具有正确的参数并安装了webpack,它将自动运行webpack构建。
在那之后,您可以简单地处理指定软件包中的工作。