Apply semantic-release's automatic publishing to an Nx monorepo.
The default configuration of semantic-release assumes a one-to-one relationship between a GitHub repository and an npm package.
This library allows using semantic-release with a single GitHub repository containing many npm packages.
Instead of attributing all commits to a single package, commits are assigned to packages based on the files that a commit touched.
If a commit touched a file in or below a package's root, it will be considered for that package's next release. A single commit can belong to multiple packages and may trigger the release of multiple packages.
Additionally, if a commit touches a file of a package that is a dependency of the current package, then the commit will also be included.
In order to avoid version collisions, generated git tags are namespaced using the given package's name: <package-name>-<version>.
Both semantic-release and @rossmcewan/semantic-release-nx must be accessible in each monorepo package.
npm install -D semantic-release @rossmcewan/semantic-release-nxRun semantic-release in an individual monorepo package and apply @rossmcewan/semantic-release-nx via the extends option.
On the command line:
$ npm run semantic-release -e @rossmcewan/semantic-release-nxOr in the release config:
{
"extends": "@rossmcewan/semantic-release-nx"
}NOTE: This library CAN'T be applied via the plugins option.
{
"plugins": [
"@rossmcewan/semantic-release-nx" // This WON'T work
]
}$ yarn workspaces run semantic-release -e @rossmcewan/semantic-release-nxpnpm has built-in workspace functionality for monorepos. Similarly to the above, you can use pnpm to make release in all packages:
pnpm -r --workspace-concurrency=1 exec -- npx --no-install semantic-release -e @rossmcewan/semantic-release-nxThanks to how npx's package resolution works, if the repository root is in $PATH (typically true on CI), semantic-release and @rossmcewan/semantic-release-nx can be installed once in the repo root instead of in each individual package, likely saving both time and disk space.
This library modifies the context object passed to semantic-release plugins in the following way to make them compatible with a monorepo.
| Step | Description |
|---|---|
analyzeCommits |
Filters context.commits to only include the given monorepo package's commits and any commmits that affects packages the current package depends on. |
generateNotes |
|
Pre-configures the tagFormat option to use the monorepo git tag format.