This is my attempt to learn how to use Bazel as the build system for a monorepo.
I'm starting with Javascript and Typescript applications and libraries as I currently work in that ecosystem.
Install the dependencies first.
yarn
Build everything
yarn build
Build a package
yarn exec bazelisk -- build //path/to/package:target
Run an app
yarn exec bazelisk -- run //path/to/package:target
# examples
yarn exec bazelisk -- run //apps/javascript/no_deps:bin
yarn exec bazelisk -- run //apps/javascript/internal_deps:bin
yarn exec bazelisk -- run //apps/javascript/external_deps:bin
yarn exec bazelisk -- run //apps/typescript/no_deps:bin
yarn exec bazelisk -- run //apps/typescript/internal_deps:bin
yarn exec bazelisk -- run //apps/typescript/external_deps:bin
Path | Description |
---|---|
//libs/javascript/no_deps |
Javascript library with no dependencies |
//libs/javascript/external_deps |
Javascript library with one external dependency |
//libs/javascript/internal_deps |
Javascript library with one internal dependency |
//libs/typescript/no_deps |
Typescript library with no dependencies |
//libs/typescript/external_deps |
Typescript library with one external dependency |
//libs/typescript/internal_deps |
Typescript library with one internal Typescript dependency (note: import paths are from workspace root in TS source code) |
//apps/javascript/no_deps |
Javascript app with no dependencies |
//apps/javascript/external_deps |
Javascript app with one external dependency |
//apps/javascript/internal_deps |
Javascript app with one internal dependency |
//apps/typescript/no_deps |
Typescript app with no dependencies |
The root package.json
file is important for bootstrapping all the dependencies used in the repo.
Most of the other package.json
files are optional. They are only used if we are building a publishable package using the pkg_npm
rule.
Bazel's Typescript support adds the workspace root as an import path so you can refer to local packages easily. See the path in tsconfig.json
and the import in libs/typescript/internal_deps/index.ts
for an example.
Bundling packages with rollup
doesn't seem to work in all cases. I don't know why not.