Schedule tasks in a monorepo
npm install @microsoft/task-schedulerjs
const { createPipeline } = require("@microsoft/task-scheduler");
// this graph describes a topological graph
// e.g. {foo: {location: 'packages/foo', dependencies: ['bar']}, bar: { ... }}
const graph = getDependencyGraph();
const pipeline = await createPipeline(graph)
// defining a task with NO task dependencies
.addTask({
name: "prepare",
run: prepare
})
// defining a task with task dependencies as well as the topological deps
.addTask({
name: "build",
run: build,
deps: ["prepare"],
topoDeps: ["build"]
})
.addTask({
name: "test",
run: test,
deps: ["build"]
})
.addTask({
name: "bundle",
run: bundle,
deps: ["build"]
})
// you can call go() with no parameters to target everything, or specify which packages or tasks to target
.go({
packages: ["foo", "bar"],
tasks: ["test", "bundle"]
});
async function prepare(cwd, stdout, stderr) {
...
}
async function build(cwd, stdout, stderr) {
...
}
async function test(cwd, stdout, stderr) {
...
}
async function bundle(cwd, stdout, stderr) {
...
}
`
A Task is described by this:
`ts
type Task = {
/* name of the task /
name: string;
/* a function that gets invoked by the task-scheduler /
run: (cwd: string, stdout: Writable, stderr: Writable) => Promise;
/* dependencies between tasks within the same package (e.g. build -> test) /
deps?: string[];
/* dependencies across packages within the same topological graph (e.g. parent build -> child build) /
topoDeps?: string[];
/* An optional priority to set for packages that have this task. Unblocked tasks with a higher priority will be scheduled before lower priority tasks. /
priorities?: {
[packageName: string]: number;
};
};
`
Here is how the tasks defined above would run on a repo which has two packages A and B, A depending on B:
`
A: [-prepare-] [------build------] [----test----]
[-----bundle-----]
B: [-prepare-] [------build------] [----test----]
[-----bundle-----]
----------> time
`
Here is how the same workflow would be executed by using lerna:
`
A: [-prepare-] [------build------] [----test----][-----bundle-----]
B: [-prepare-] [------build------] [----test----][-----bundle-----]
----------> time
`
Contributing
Development
This repo uses beachball for automated releases and semver. Please include a change file by running:
`
$ yarn change
``