1
0
mirror of https://github.com/goreleaser/goreleaser.git synced 2025-03-19 20:57:53 +02:00
Carlos Alexandro Becker a23c9df16b
docs: minor docs improvements (#5320)
- better styling
- short codes
- no 404 on unreleased `Since: ` block
2024-11-29 11:17:45 -03:00

2.3 KiB

Monorepo

If you want to use GoReleaser within a monorepo and use tag prefixes to mark "which tags belong to which sub project", GoReleaser has you covered.

Premises

You project falls into either one of these categories:

  1. tags are like subproject1/v1.2.3 and subproject2/v1.2.3;
  2. tags are like @user/thing@v1.2.3 (for a NPM package, for example) and v1.2.3 for the rest of the (Go) code.

Usage

Category 1

You'll need to create a .goreleaser.yaml for each subproject you want to use GoReleaser in:

# subroj1/.goreleaser.yaml
project_name: subproj1

monorepo:
  tag_prefix: subproject1/
  dir: subproj1

Then, you can release with (from the project's root directory):

goreleaser release --clean -f ./subproj1/.goreleaser.yaml

Then, the following is different from a "regular" run:

  • GoReleaser will then look if current commit has a tag prefixed with subproject1, and the previous tag with the same prefix;
  • Changelog will include only commits that contain changes to files within the subproj1 directory;
  • Release name gets prefixed with {{ .ProjectName }} if empty;
  • All build's dir setting get set to monorepo.dir if empty;
    • if yours is not, you might want to change that manually;
  • Extra files on the release, archives, Docker builds, etc are prefixed with monorepo.dir;
  • If using changelog.use: git, only commits matching files in monorepo.dir will be included in the changelog.
  • On templates, {{.PrefixedTag}} will be monorepo.prefix/tag (aka the actual tag name), and {{.Tag}} has the prefix stripped;

The rest of the release process should work as usual.

Category 2

You'll need to create a .goreleaser.yaml for your Go code in the root of the project:

monorepo:
  tag_prefix: v

Then, you can release with:

goreleaser release --clean

GoReleaser will then ignore the tags that are not prefixed with v, and it should work as expected from there on.

A note about gomods and prefixed tags

!!! note

If you have a `github.com/user/repo/moda` module, its tags should be named
`moda/v1.2.3`.
This will allow users to `go get github.com/user/repo/moda@v1.2.3`, and
everything should work as you'd expect.

!!! warning

Tag prefixes that do not match the module name are not supported by go mods.