使用纱线工作区和lerna优先确定构建顺序

时间:2018-07-25 08:29:02

标签: typescript build yarnpkg lerna yarn-workspaces

我在单一存储库中有一个使用yarn workspaceslerna并具有以下架构的大型打字稿项目:

repo
├── API
│   └── (GraphQL API)
├── Apps
│   └── (Front-end React Apps)
├── Libs
│   └── (Shared libraries)
└── Services
    └── (Back-end Services)

我的package.json类似于:

{
   ...
   "workspaces": [
        "API/**/*",
        "Apps/**/*",
        "Libs/**/*",
        "Services/**/*",
    ],
    "scripts": {
        "bootstrap": "lerna bootstrap",
        "build": "lerna run build"
    }
    ...
}

我的lerna.json如下:

{
    "lerna": "2.11.0",
    "npmClient": "yarn",
    "useWorkspaces": true,
    "workspaces": [
        "Libs/**/*",
        "API/**/*",
        "Apps/**/*",
        "Services/**/*"
    ],
    "version": "1.0.0"
}

现在,我需要在LibsApps之前都构建所有共享的Services,因为它们对此具有依赖性。但是,当我运行yarn build并触发lerna run build时,它似乎以随机(?)顺序触发了build进程,因此它无法构建,因为库“不存在” ”。

是否有一种方法可以针对lerna触发构建的方式设置顺序?

1 个答案:

答案 0 :(得分:2)

到目前为止,lerna中没有优先级。

尽管这是我目前在多个项目中所做的事情:

"scripts": {
  ...
  "build": "lerna run build --ignore=libs-*",
  "prebuild": "lerna run build --scope=libs-*"
  ...
}

注意:prebuild将自动运行,因此您无需显式调用

此处需要说明的是,您需要在所有Libs软件包名称前面加上libs-module-name之类的前缀,或者在诸如@my-org-libs/module-name之类的范围前加上{{1} }。

另一种解决方案是在@my-org-libs/*中使用多个Libs参数显式调用每个--scope=package-name --scope=package-name-2包。但是,如果您在prebuild下有许多模块,那可能很快就会变得很难看。