diff --git a/Taskfile.yml b/Taskfile.yml new file mode 100644 index 0000000..887fb96 --- /dev/null +++ b/Taskfile.yml @@ -0,0 +1,167 @@ +version: '3' + +vars: + GOCMD: go + BINARY_NAME: reticulum-go + BUILD_DIR: bin + MAIN_PACKAGE: ./cmd/reticulum-go + +tasks: + default: + desc: Show available tasks + cmds: + - task --list + + all: + desc: Clean, download dependencies, build and test + deps: [clean, deps, build, test] + + build: + desc: Build release binary (no debug symbols, static) + env: + CGO_ENABLED: '0' + cmds: + - mkdir -p {{.BUILD_DIR}} + - '{{.GOCMD}} build -ldflags="-s -w" -o {{.BUILD_DIR}}/{{.BINARY_NAME}} {{.MAIN_PACKAGE}}' + + debug: + desc: Build debug binary + cmds: + - mkdir -p {{.BUILD_DIR}} + - '{{.GOCMD}} build -o {{.BUILD_DIR}}/{{.BINARY_NAME}} {{.MAIN_PACKAGE}}' + + build-experimental: + desc: Build binary with experimental features (GOEXPERIMENT=greenteagc) + env: + GOEXPERIMENT: greenteagc + cmds: + - mkdir -p {{.BUILD_DIR}} + - '{{.GOCMD}} build -o {{.BUILD_DIR}}/{{.BINARY_NAME}}-experimental {{.MAIN_PACKAGE}}' + + experimental: + desc: Alias for build-experimental + cmds: + - task: build-experimental + + release: + desc: Build stripped static binary for release (alias for build) + cmds: + - task: build + + fmt: + desc: Format Go code + cmds: + - '{{.GOCMD}} fmt ./...' + + fmt-check: + desc: Check if code is formatted (useful for CI) + cmds: + - '{{.GOCMD}} fmt -d ./... > fmt.diff 2>&1 || true' + - 'test -s fmt.diff && (echo "Code is not formatted. Run ''task fmt'' to fix." && cat fmt.diff && rm -f fmt.diff && exit 1) || (rm -f fmt.diff && exit 0)' + + vet: + desc: Run go vet + cmds: + - '{{.GOCMD}} vet ./...' + + lint: + desc: Run revive linter + cmds: + - revive -config revive.toml -formatter friendly ./pkg/* ./cmd/* ./internal/* + + check: + desc: Run fmt-check, vet, and lint + deps: [fmt-check, vet, lint] + + bench: + desc: Run benchmarks with standard GC + cmds: + - '{{.GOCMD}} test -bench=. -benchmem ./...' + + bench-experimental: + desc: Run benchmarks with experimental GC + env: + GOEXPERIMENT: greenteagc + cmds: + - '{{.GOCMD}} test -bench=. -benchmem ./...' + + bench-compare: + desc: Run benchmarks with both GC settings + deps: [bench, bench-experimental] + + clean: + desc: Remove build artifacts + cmds: + - '{{.GOCMD}} clean' + - rm -rf {{.BUILD_DIR}} + + test: + desc: Run tests + cmds: + - '{{.GOCMD}} test -v ./...' + + test-short: + desc: Run short tests + cmds: + - '{{.GOCMD}} test -short -v ./...' + + coverage: + desc: Generate test coverage report + cmds: + - '{{.GOCMD}} test -coverprofile=coverage.out ./...' + - '{{.GOCMD}} tool cover -html=coverage.out' + + deps: + desc: Download and verify dependencies + env: + GOPROXY: '{{.GOPROXY | default "https://proxy.golang.org,direct"}}' + cmds: + - '{{.GOCMD}} mod download' + - '{{.GOCMD}} mod verify' + + mod-tidy: + desc: Tidy go.mod file + cmds: + - '{{.GOCMD}} mod tidy' + + mod-verify: + desc: Verify dependencies + cmds: + - '{{.GOCMD}} mod verify' + + build-linux: + desc: Build for Linux (amd64, arm64, arm, riscv64) + env: + CGO_ENABLED: '0' + cmds: + - mkdir -p {{.BUILD_DIR}} + - 'GOOS=linux GOARCH=amd64 {{.GOCMD}} build -o {{.BUILD_DIR}}/{{.BINARY_NAME}}-linux-amd64 {{.MAIN_PACKAGE}}' + - 'GOOS=linux GOARCH=arm64 {{.GOCMD}} build -o {{.BUILD_DIR}}/{{.BINARY_NAME}}-linux-arm64 {{.MAIN_PACKAGE}}' + - 'GOOS=linux GOARCH=arm {{.GOCMD}} build -o {{.BUILD_DIR}}/{{.BINARY_NAME}}-linux-arm {{.MAIN_PACKAGE}}' + - 'GOOS=linux GOARCH=riscv64 {{.GOCMD}} build -o {{.BUILD_DIR}}/{{.BINARY_NAME}}-linux-riscv64 {{.MAIN_PACKAGE}}' + + build-all: + desc: Build for all Linux architectures + deps: [build-linux] + + run: + desc: Run with go run + cmds: + - '{{.GOCMD}} run {{.MAIN_PACKAGE}}' + + tinygo-build: + desc: Build binary with TinyGo compiler + cmds: + - mkdir -p {{.BUILD_DIR}} + - tinygo build -o {{.BUILD_DIR}}/{{.BINARY_NAME}}-tinygo -size short {{.MAIN_PACKAGE}} + + tinygo-wasm: + desc: Build WebAssembly binary with TinyGo compiler + cmds: + - mkdir -p {{.BUILD_DIR}} + - tinygo build -target wasm -o {{.BUILD_DIR}}/{{.BINARY_NAME}}.wasm {{.MAIN_PACKAGE}} + + install: + desc: Install dependencies + cmds: + - '{{.GOCMD}} mod download' \ No newline at end of file