Skip to main content

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

FeatureMakeJust
Variable syntax$(VAR){{var}}
Shell recipeRequires @Native support
Cross-platformLimitedBetter
Recipe argumentsComplexSimple
DependenciesTabs requiredFlexible

Best Practices

  1. Cache version: Capture version once per build, not per target
  2. Use variables: Define version at top, reference everywhere
  3. Clean targets: Include version in artifact names for clarity
  4. Document recipes: Add comments explaining complex recipes
  5. Fail fast: Use set -e in shell recipes

See Also