源码地址
源码指向的master分支,可能代码会改变,这里拷贝下来:
const userConfig = getUserConfig({ cwd });
let pkgs = readdirSync(join(cwd, 'packages'));
// support define pkgs in lerna
if (userConfig.pkgs) {
pkgs = userConfig.pkgs;
}
// 支持 scope
pkgs = pkgs.reduce((memo, pkg) => {
const pkgPath = join(cwd, 'packages', kg);
if (statSync(pkgPath).isDirectory()) {
// 注意这里
if (pkg.startsWith('@')) {
readdirSync(join(cwd, 'packages', pkg)).filter(subPkg => {
if (statSync(join(cwd, 'packages', pkg, subPkg)).isDirectory()) {
memo = memo.concat(`${pkg}/${subPkg}`);
}
});
} else {
memo = memo.concat(pkg);
}
}
return memo;
}, []);
father
默认打包顺序是按文件夹名称顺序,
我们项目中my-test
是排在umi-origin-test
的,
此时father
会先打包my-test
,
但是my-test
引用了umi-origin-test
,这时打包就会报错或者获取不到最新的umi-origin-test
代码
所以father
提供了pkgs
配置来管理打包优先级,但是它不能传以下格式的包,否则会报错,我们看上面的源码也知道原因
pkgs: ['@demo/umi-origin-test', '@demo/my-test']
,issues
临时配置pkgs为(其实也可以不配置,我这里只是为了排除其他包的影响,也是为了演示上面源码的逻辑):
pkgs: ['@demo']
,
然后运行两次yarn build
当然还有其他方式解决,如:
在每个包中添加father build
命令
添加这个命令的时候记得在当前包中添加father
依赖(参考lerna
添加方式或者yarn workspace
方式),
此时会在当前包创建node_modules
文件夹,在其中创建father
的bin
脚本指引
然后用lerna run
命令来执行,
但是不推荐这种方式,这种方式有悖umi-father
的设计思路