Adds releases.js, install.sh, install.ps1, and README.md for monorel, a Go monorepo release tool from therootcompany/golib. Filters monorepo releases by tools/monorel/ prefix and auto-installs prerequisites (git, gh, goreleaser).
title, homepage, tagline
| title | homepage | tagline |
|---|---|---|
| monorel | https://github.com/therootcompany/golib/tree/main/tools/monorel | monorel: Monorepo Release Tool for Go binaries. |
To update or switch versions, run webi monorel@stable (or @v0.6, @beta,
etc).
Files
These are the files that are created and/or modified with this installer:
~/.config/envman/PATH.env
~/.local/bin/monorel
~/.local/opt/monorel-VERSION/bin/monorel
These are the files that monorel creates and/or modifies in your project:
<module>/.goreleaser.yaml
.git/refs/tags/<module>/v*
Cheat Sheet
monorelmanages independently-versioned Go modules and releases in a single repository — initializing goreleaser configs, bumping versions, and publishing multi-arch releases.
How to use monorel
# Generate .goreleaser.yaml for all modules
monorel init --recursive ./
# Tag the next patch version for all modules with new commits
monorel bump --recursive ./
# Build, package, and publish GitHub releases for all binaries of a module
monorel release --recursive ./tools/monorel
How monorepo versioning works
Each go.mod is an independently-versioned module. Tags use the module's path
as a prefix, and each module with binaries gets a .goreleaser.yaml:
./
├── go.mod # v0.1.1 (library-only)
├── io/
│ └── transform/
│ └── gsheet2csv/
│ ├── go.mod # io/transform/gsheet2csv/v1.0.5
│ ├── .goreleaser.yaml
│ └── cmd/
│ ├── gsheet2csv/
│ ├── gsheet2env/
│ └── gsheet2tsv/
└── tools/
└── monorel/
├── go.mod # tools/monorel/v1.0.0
└── .goreleaser.yaml
monorel init vs goreleaser init
goreleaser init generates a config that assumes one module per repo and
derives names and versions from the git tag. That breaks in a monorepo with
prefixed tags. monorel init fixes this:
goreleaser init |
monorel init |
|
|---|---|---|
| Project name | {{ .ProjectName }} |
Hard-coded binary name |
| Version | Derived from git tag | {{ .Env.VERSION }} (plain semver) |
| Publishing | goreleaser's built-in | Disabled; uses gh release instead |
| Multiple bins | Manual config | Auto-discovered, shared via YAML anchor |
| Monorepo tags | (requires Pro subscription) | Prefix-aware (cmd/foo/v1.2.3) |
Generated .goreleaser.yaml: single binary
For a module with one binary (like tools/monorel/), the generated config has a
single build entry:
builds:
- id: monorel
binary: monorel
env:
- CGO_ENABLED=0
ldflags:
- >-
-s -w -X main.version={{.Env.VERSION}} -X main.commit={{.Commit}} -X
main.date={{.Date}}
goos:
- darwin
- linux
- windows
# ... and more
archives:
- id: monorel
ids: [monorel]
# Hard-coded name instead of {{ .ProjectName }} — goreleaser derives
# ProjectName from the prefixed tag, which would produce messy filenames.
# {{ .Env.VERSION }} for the same reason — the raw tag version includes
# the module path prefix.
name_template: >-
monorel_{{ .Env.VERSION }}_{{ title .Os }}_{{ .Arch }}
# goreleaser Pro would be needed to publish from a prefixed tag,
# so monorel disables goreleaser's publisher and uses 'gh release' instead.
release:
disable: true
Generated .goreleaser.yaml: multiple binaries
When a module has several commands under cmd/, monorel generates a build entry
per binary with shared settings via a YAML anchor:
builds:
- id: gsheet2csv
binary: gsheet2csv
main: ./cmd/gsheet2csv
<<: &build_defaults
env:
- CGO_ENABLED=0
ldflags:
- >-
-s -w -X main.version={{.Env.VERSION}}
goos:
- darwin
- linux
- windows
# ...
- id: gsheet2env
binary: gsheet2env
main: ./cmd/gsheet2env
<<: *build_defaults
- id: gsheet2tsv
binary: gsheet2tsv
main: ./cmd/gsheet2tsv
<<: *build_defaults
archives:
- id: gsheet2csv
# All binaries are bundled into one archive per platform.
ids: [gsheet2csv, gsheet2env, gsheet2tsv]
# Same hard-coded name and {{ .Env.VERSION }} to avoid prefixed tag leaking.
name_template: >-
gsheet2csv_{{ .Env.VERSION }}_{{ title .Os }}_{{ .Arch }}
# Same as single binary — disable goreleaser's publisher for monorepo tags.
release:
disable: true
All three binaries share one version tag (io/transform/gsheet2csv/v1.0.5) and
one GitHub release.