I have this big typescript project in a mono-repository using yarn workspaces and lerna with the following architecture:
repo
├── API
│   └── (GraphQL API)
├── Apps
│   └── (Front-end React Apps)
├── Libs
│   └── (Shared libraries)
└── Services
    └── (Back-end Services)
My package.json looks something like:
{
   ...
   "workspaces": [
        "API/**/*",
        "Apps/**/*",
        "Libs/**/*",
        "Services/**/*",
    ],
    "scripts": {
        "bootstrap": "lerna bootstrap",
        "build": "lerna run build"
    }
    ...
}
My lerna.json looks like:
{
    "lerna": "2.11.0",
    "npmClient": "yarn",
    "useWorkspaces": true,
    "workspaces": [
        "Libs/**/*",
        "API/**/*",
        "Apps/**/*",
        "Services/**/*"
    ],
    "version": "1.0.0"
}
Now I need to build all the shared Libs before both Apps and Services because they have dependencies to it. But when I run yarn build and it triggers lerna run build it seems that it triggers the build process in a random(?) order, so it fails to build because the libraries "don't exist, yet".
Is there a way to set an order on how lerna triggers a build?
There is no prioritization in lerna so far.
Although here's what I do in several projects at the moment:
"scripts": {
  ...
  "build": "lerna run build --ignore=libs-*",
  "prebuild": "lerna run build --scope=libs-*"
  ...
}
Note: prebuild will run automatically so you don't need to call it explicitly
One caveat here is you need to prefix all Libs package names with either something like libs-module-name as the example above or maybe a scope like @my-org-libs/module-name and call them with @my-org-libs/* instead.
Another solution would be calling each Libs package explicitly with multiple --scope=package-name --scope=package-name-2 parameter in prebuild. But that might get quickly ugly if you have many modules under Libs.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With