Makefiles and Just
Versionator integrates seamlessly with Make and Just command runners.
Make
Basic Integration
# Get version from versionator
VERSION := $(shell versionator version)
# Build with version
build:
go build -ldflags "-X main.VERSION=$(VERSION)" -o app
# Show version
version:
@echo $(VERSION)
Full Version String
# With pre-release and metadata
FULL_VERSION := $(shell versionator output version \
-t "{{Prefix}}{{MajorMinorPatch}}{{PreReleaseWithDash}}{{MetadataWithPlus}}" \
--prefix \
--metadata="{{ShortHash}}")
build:
go build -ldflags "-X main.VERSION=$(FULL_VERSION)" -o app
Version Bump Targets
.PHONY: bump-major bump-minor bump-patch release
bump-major:
versionator major increment
@echo "Version: $(shell versionator version)"
bump-minor:
versionator minor increment
@echo "Version: $(shell versionator version)"
bump-patch:
versionator patch increment
@echo "Version: $(shell versionator version)"
release: bump-patch
versionator release
git push
git push --tags
Multiple Languages
VERSION := $(shell versionator version)
# Generate version files
generate-version:
versionator output emit python --output src/_version.py
versionator output emit json --output version.json
# Build all
build: generate-version
python -m build
docker build -t myapp:$(VERSION) .
C/C++ Integration
VERSION := $(shell versionator version)
# Pass version as compiler define
CFLAGS += -DVERSION="\"$(VERSION)\""
app: main.c
$(CC) $(CFLAGS) -o $@ $<
Just
Just is a modern command runner alternative to Make.
Basic Integration
# Get version
version := `versionator output version`
# Build with version
build:
go build -ldflags "-X main.VERSION={{version}}" -o app
# Show version
show-version:
@echo {{version}}
Shell Interpolation
# Using shell in recipe
build:
#!/bin/bash
VERSION=$(versionator version)
go build -ldflags "-X main.VERSION=$VERSION" -o app
Version Bumping
# Bump and show new version
bump-major:
versionator major increment
@versionator output version
bump-minor:
versionator minor increment
@versionator output version
bump-patch:
versionator patch increment
@versionator output version
Release Recipe
# Full release workflow
release bump="patch":
#!/bin/bash
set -e
# Bump version and release
versionator {{bump}} increment
versionator release
VERSION=$(versionator version)
# Push
git push
git push --tags
echo "Released $VERSION"
Generate Version Files
# Generate version files for all languages
generate-version:
versionator output emit python --output src/_version.py
versionator output emit json --output version.json
versionator output emit go --output internal/version/version.go
# Build (depends on generate)
build: generate-version
go build -o app
Dynamic Metadata
# Build with dynamic metadata
build-ci:
#!/bin/bash
VERSION=$(versionator output version \
-t "{{MajorMinorPatch}}{{MetadataWithPlus}}" \
--metadata="{{BuildDateTimeCompact}}.{{ShortHash}}")
echo "Building $VERSION"
go build -ldflags "-X main.VERSION=$VERSION" -o app
Cross-Platform Recipes
# Platform-specific builds
build-linux:
GOOS=linux GOARCH=amd64 go build \
-ldflags "-X main.VERSION={{version}}" \
-o dist/app-linux-amd64
build-darwin:
GOOS=darwin GOARCH=arm64 go build \
-ldflags "-X main.VERSION={{version}}" \
-o dist/app-darwin-arm64
build-windows:
GOOS=windows GOARCH=amd64 go build \
-ldflags "-X main.VERSION={{version}}" \
-o dist/app-windows-amd64.exe
# Build all platforms
build-all: build-linux build-darwin build-windows
Documentation Tasks
# Docs tasks
docs-dev:
cd docs && npm start
docs-build:
cd docs && npm run build
docs-generate:
node docs/scripts/generate-command-docs.js
Comparison
| Feature | Make | Just |
|---|---|---|
| Variable syntax | $(VAR) | {{var}} |
| Shell recipe | Requires @ | Native support |
| Cross-platform | Limited | Better |
| Recipe arguments | Complex | Simple |
| Dependencies | Tabs required | Flexible |
Best Practices
- Cache version: Capture version once per build, not per target
- Use variables: Define version at top, reference everywhere
- Clean targets: Include version in artifact names for clarity
- Document recipes: Add comments explaining complex recipes
- Fail fast: Use
set -ein shell recipes
See Also
- CI/CD Integration - Pipeline integration
- Binary Embedding - Language-specific examples