mirror of
https://github.com/yarlson/lnk.git
synced 2025-08-31 18:01:41 +02:00
feat: add comprehensive Makefile with excellent DX
This commit is contained in:
5
.gitignore
vendored
5
.gitignore
vendored
@@ -11,11 +11,16 @@ lnk
|
||||
|
||||
# Output of the go coverage tool
|
||||
*.out
|
||||
*.html
|
||||
|
||||
# Go workspace file
|
||||
go.work
|
||||
go.work.sum
|
||||
|
||||
# Build artifacts
|
||||
dist/
|
||||
bin/
|
||||
|
||||
# IDE and editor files
|
||||
.vscode/
|
||||
.idea/
|
||||
|
164
Makefile
Normal file
164
Makefile
Normal file
@@ -0,0 +1,164 @@
|
||||
# Variables
|
||||
BINARY_NAME=lnk
|
||||
VERSION=$(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
|
||||
BUILD_TIME=$(shell date +%FT%T%z)
|
||||
LDFLAGS=-ldflags "-X main.version=$(VERSION) -X main.buildTime=$(BUILD_TIME)"
|
||||
|
||||
# Go related variables
|
||||
GOBASE=$(shell pwd)
|
||||
GOBIN=$(GOBASE)/bin
|
||||
GOFILES=$(wildcard *.go)
|
||||
|
||||
# Colors for pretty output
|
||||
RED=\033[0;31m
|
||||
GREEN=\033[0;32m
|
||||
YELLOW=\033[0;33m
|
||||
BLUE=\033[0;34m
|
||||
NC=\033[0m # No Color
|
||||
|
||||
.PHONY: help build test clean install uninstall fmt lint vet tidy run dev cross-compile release
|
||||
|
||||
## help: Show this help message
|
||||
help:
|
||||
@echo "$(BLUE)Lnk CLI - Available targets:$(NC)"
|
||||
@echo ""
|
||||
@echo "$(GREEN)Development:$(NC)"
|
||||
@echo " build Build the binary"
|
||||
@echo " test Run tests"
|
||||
@echo " test-v Run tests with verbose output"
|
||||
@echo " test-cover Run tests with coverage"
|
||||
@echo " run Run the application"
|
||||
@echo " dev Development mode with file watching"
|
||||
@echo ""
|
||||
@echo "$(GREEN)Code Quality:$(NC)"
|
||||
@echo " fmt Format Go code"
|
||||
@echo " lint Run golangci-lint"
|
||||
@echo " vet Run go vet"
|
||||
@echo " tidy Tidy Go modules"
|
||||
@echo " check Run all quality checks (fmt, vet, lint, test)"
|
||||
@echo ""
|
||||
@echo "$(GREEN)Installation:$(NC)"
|
||||
@echo " install Install binary to /usr/local/bin"
|
||||
@echo " uninstall Remove binary from /usr/local/bin"
|
||||
@echo ""
|
||||
@echo "$(GREEN)Release:$(NC)"
|
||||
@echo " cross-compile Build for multiple platforms"
|
||||
@echo " release Create release builds"
|
||||
@echo ""
|
||||
@echo "$(GREEN)Utilities:$(NC)"
|
||||
@echo " clean Clean build artifacts"
|
||||
@echo " deps Install development dependencies"
|
||||
|
||||
## build: Build the binary
|
||||
build:
|
||||
@echo "$(BLUE)Building $(BINARY_NAME)...$(NC)"
|
||||
@go build $(LDFLAGS) -o $(BINARY_NAME) .
|
||||
@echo "$(GREEN)✓ Build complete: $(BINARY_NAME)$(NC)"
|
||||
|
||||
## test: Run tests
|
||||
test:
|
||||
@echo "$(BLUE)Running tests...$(NC)"
|
||||
@go test ./test
|
||||
@echo "$(GREEN)✓ Tests passed$(NC)"
|
||||
|
||||
## test-v: Run tests with verbose output
|
||||
test-v:
|
||||
@echo "$(BLUE)Running tests (verbose)...$(NC)"
|
||||
@go test -v ./test
|
||||
|
||||
## test-cover: Run tests with coverage
|
||||
test-cover:
|
||||
@echo "$(BLUE)Running tests with coverage...$(NC)"
|
||||
@go test -v -cover ./test
|
||||
@go test -coverprofile=coverage.out ./test
|
||||
@go tool cover -html=coverage.out -o coverage.html
|
||||
@echo "$(GREEN)✓ Coverage report generated: coverage.html$(NC)"
|
||||
|
||||
## run: Run the application
|
||||
run: build
|
||||
@echo "$(BLUE)Running $(BINARY_NAME)...$(NC)"
|
||||
@./$(BINARY_NAME)
|
||||
|
||||
## dev: Development mode with file watching (requires entr)
|
||||
dev:
|
||||
@echo "$(YELLOW)Development mode - watching for changes...$(NC)"
|
||||
@echo "$(YELLOW)Install 'entr' if not available: brew install entr$(NC)"
|
||||
@find . -name "*.go" | entr -r make run
|
||||
|
||||
## fmt: Format Go code
|
||||
fmt:
|
||||
@echo "$(BLUE)Formatting code...$(NC)"
|
||||
@go fmt ./...
|
||||
@echo "$(GREEN)✓ Code formatted$(NC)"
|
||||
|
||||
## lint: Run golangci-lint
|
||||
lint:
|
||||
@echo "$(BLUE)Running linter...$(NC)"
|
||||
@if command -v golangci-lint >/dev/null 2>&1; then \
|
||||
golangci-lint run; \
|
||||
echo "$(GREEN)✓ Linting complete$(NC)"; \
|
||||
else \
|
||||
echo "$(YELLOW)⚠ golangci-lint not found. Install with: go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest$(NC)"; \
|
||||
fi
|
||||
|
||||
## vet: Run go vet
|
||||
vet:
|
||||
@echo "$(BLUE)Running go vet...$(NC)"
|
||||
@go vet ./...
|
||||
@echo "$(GREEN)✓ Vet check passed$(NC)"
|
||||
|
||||
## tidy: Tidy Go modules
|
||||
tidy:
|
||||
@echo "$(BLUE)Tidying modules...$(NC)"
|
||||
@go mod tidy
|
||||
@echo "$(GREEN)✓ Modules tidied$(NC)"
|
||||
|
||||
## check: Run all quality checks
|
||||
check: fmt vet lint test
|
||||
@echo "$(GREEN)✓ All quality checks passed$(NC)"
|
||||
|
||||
## install: Install binary to /usr/local/bin
|
||||
install: build
|
||||
@echo "$(BLUE)Installing $(BINARY_NAME) to /usr/local/bin...$(NC)"
|
||||
@sudo cp $(BINARY_NAME) /usr/local/bin/
|
||||
@echo "$(GREEN)✓ $(BINARY_NAME) installed$(NC)"
|
||||
|
||||
## uninstall: Remove binary from /usr/local/bin
|
||||
uninstall:
|
||||
@echo "$(BLUE)Uninstalling $(BINARY_NAME)...$(NC)"
|
||||
@sudo rm -f /usr/local/bin/$(BINARY_NAME)
|
||||
@echo "$(GREEN)✓ $(BINARY_NAME) uninstalled$(NC)"
|
||||
|
||||
## cross-compile: Build for multiple platforms
|
||||
cross-compile: clean
|
||||
@echo "$(BLUE)Cross-compiling for multiple platforms...$(NC)"
|
||||
@mkdir -p dist
|
||||
@GOOS=linux GOARCH=amd64 go build $(LDFLAGS) -o dist/$(BINARY_NAME)-linux-amd64 .
|
||||
@GOOS=linux GOARCH=arm64 go build $(LDFLAGS) -o dist/$(BINARY_NAME)-linux-arm64 .
|
||||
@GOOS=darwin GOARCH=amd64 go build $(LDFLAGS) -o dist/$(BINARY_NAME)-darwin-amd64 .
|
||||
@GOOS=darwin GOARCH=arm64 go build $(LDFLAGS) -o dist/$(BINARY_NAME)-darwin-arm64 .
|
||||
@GOOS=windows GOARCH=amd64 go build $(LDFLAGS) -o dist/$(BINARY_NAME)-windows-amd64.exe .
|
||||
@echo "$(GREEN)✓ Cross-compilation complete. Binaries in dist/$(NC)"
|
||||
|
||||
## release: Create release builds with checksums
|
||||
release: cross-compile
|
||||
@echo "$(BLUE)Creating release artifacts...$(NC)"
|
||||
@cd dist && sha256sum * > checksums.txt
|
||||
@echo "$(GREEN)✓ Release artifacts created in dist/$(NC)"
|
||||
|
||||
## clean: Clean build artifacts
|
||||
clean:
|
||||
@echo "$(BLUE)Cleaning...$(NC)"
|
||||
@rm -f $(BINARY_NAME)
|
||||
@rm -rf dist/
|
||||
@rm -f coverage.out coverage.html
|
||||
@echo "$(GREEN)✓ Clean complete$(NC)"
|
||||
|
||||
## deps: Install development dependencies
|
||||
deps:
|
||||
@echo "$(BLUE)Installing development dependencies...$(NC)"
|
||||
@go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
|
||||
@echo "$(GREEN)✓ Dependencies installed$(NC)"
|
||||
|
||||
# Default target
|
||||
all: check build
|
Reference in New Issue
Block a user