golang现代化构建工具插件库mmake的使用
Golang现代化构建工具插件库mmake的使用
关于mmake
Mmake是一个小型程序,它包装了make
以提供额外功能,例如用户友好的帮助输出、远程包含等。除此之外,它的行为与标准make相同。
安装
通过gobinaries.com安装
$ curl -sf https://gobinaries.com/tj/mmake/cmd/mmake | sudo sh
从源码构建
$ go get github.com/tj/mmake/cmd/mmake
Homebrew安装
$ brew tap tj/mmake https://github.com/tj/mmake.git
$ brew install tj/mmake/mmake
添加别名
在你的配置文件中添加以下别名:
alias make=mmake
主要功能
帮助输出
虽然make的主要功能不是作为"任务运行器",但由于其普遍性,它经常被用于这种场景。然而,make缺乏显示帮助信息的内置机制。
示例Makefile:
# Start the dev server.
#
# Note that the API server must
# also be running.
start:
@gopherjs -m -v serve --http :3000 github.com/tj/docs/client
.PHONY: start
# Start the API server.
api:
@go run server/cmd/api/api.go
.PHONY: api
# Display dependency graph.
deps:
@godepgraph github.com/tj/docs/client | dot -Tsvg | browser
.PHONY: deps
# Display size of dependencies.
#- Any comment preceded by a dash is omitted.
size:
@gopherjs build client/*.go -m -o /tmp/out.js
@du -h /tmp/out.js
@gopher-count /tmp/out.js | sort -nr
.PHONY: size
Mmake提供了一个help
命令来显示所有目标的简短注释:
$ alias make=mmake
$ make help
start Start the dev server.
api Start the API server.
deps Display dependency graph.
size Display size of dependencies.
你可以选择性地过滤要查看帮助的命令(支持标准Unix glob模式):
$ make help start
start Start the dev server.
$ make help s*
size Display size of dependencies.
start Start the dev server.
help
命令还支持使用详细标志(-v
/--verbose
)显示更长的输出:
$ make help -v start
Start the dev server.
Note that the API server must
also be running.
$ make help -v
start:
Start the dev server.
Note that the API server must
also be running.
api:
Start the API server.
deps:
Display dependency graph.
size:
Display size of dependencies.
make的默认行为当然保留:
$ make
serving at http://localhost:3000 and on port 3000 of any available addresses
$ make size
...
远程包含
包含可以指定URL(http、https或github快捷方式)进行包含,这些URL会自动下载到/usr/local/include
并可供make使用。注意,make默认会解析此目录中的包含,因此Makefile对于常规用户仍然有效。
包含是递归解析的。例如,你可能有一组标准包含供你的团队运行测试、lint和部署:
include github.com/apex/make/deploy
include github.com/apex/make/lint
include github.com/apex/make/test
include https://github.com/apex/make/test/Makefile
include https://github.com/apex/make/test/make.mk
这可能很难记住,所以你也可以提供一个包含其他文件的文件:
include github.com/apex/make/all
如果给定的存储库包含一个index.mk
文件,你可以只声明:
include github.com/apex/make
或者可能每个开发环境一个,如Node或Golang:
include github.com/apex/make/node
include github.com/apex/make/golang
如果你担心任意代码执行,那么只需fork一个项目并保持对其的控制。
更新
一旦远程包含被下载到/usr/local/include
,mmake
将不会尝试再次获取它们。为了获取远程包含的更新副本,mmake
提供了一个update
目标,它将再次下载它们:
$ make update
注册表
如果你想查找或分享makefile,请查看Wiki,如果缺少类别,请随意添加一个。
链接
- GNU Make文档
- Wiki注册表
- 公告博客文章
- 介绍YouTube视频
- AUR包Arch Linux包
徽章
更多关于golang现代化构建工具插件库mmake的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang现代化构建工具插件库mmake的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang现代化构建工具插件库mmake的使用指南
mmake是一个现代化的Golang构建工具插件库,它基于Makefile但提供了更简单、更模块化的方式来管理Golang项目的构建流程。以下是mmake的详细介绍和使用示例。
mmake的核心特点
- 模块化设计:将构建任务分解为可重用的模块
- 简化语法:比传统Makefile更简洁的语法
- Golang友好:专门为Golang项目优化
- 跨平台支持:在Linux、macOS和Windows上都能工作
- 依赖管理:内置依赖管理功能
安装mmake
# 使用go install安装
go install github.com/tj/mmake/cmd/mmake@latest
# 或者使用brew(macOS)
brew install mmake
基本使用示例
1. 创建基础mmakefile
创建一个名为mmakefile
的文件:
include $(GOPATH)/src/github.com/tj/mmake/base.mmake
BINARY := myapp
VERSION := 0.1.0
.PHONY: build
build: ## Build the binary
@echo "Building $(BINARY) v$(VERSION)"
@go build -o $(BINARY) ./cmd/$(BINARY)
2. 运行构建
mmake build
常用功能示例
多平台交叉编译
include $(GOPATH)/src/github.com/tj/mmake/base.mmake
BINARY := myapp
VERSION := 0.1.0
.PHONY: build
build: ## Build for current platform
@go build -o $(BINARY) ./cmd/$(BINARY)
.PHONY: release
release: ## Build release binaries for all platforms
@echo "Building release binaries for v$(VERSION)"
@GOOS=linux GOARCH=amd64 go build -o bin/$(BINARY)-linux-amd64 ./cmd/$(BINARY)
@GOOS=darwin GOARCH=amd64 go build -o bin/$(BINARY)-darwin-amd64 ./cmd/$(BINARY)
@GOOS=windows GOARCH=amd64 go build -o bin/$(BINARY)-windows-amd64.exe ./cmd/$(BINARY)
测试和覆盖率
.PHONY: test
test: ## Run tests
@go test -v ./...
.PHONY: cover
cover: ## Run tests with coverage
@go test -coverprofile=coverage.out ./...
@go tool cover -html=coverage.out -o coverage.html
代码质量检查
.PHONY: lint
lint: ## Run linters
@golangci-lint run ./...
依赖管理
.PHONY: deps
deps: ## Install dependencies
@go mod download
@go mod tidy
Docker构建
.PHONY: docker
docker: ## Build docker image
@docker build -t $(BINARY):$(VERSION) .
高级功能
1. 使用插件
mmake支持插件系统,可以轻松扩展功能。例如使用mmake-goreleaser
插件:
include $(GOPATH)/src/github.com/tj/mmake/base.mmake
include $(GOPATH)/src/github.com/tj/mmake-goreleaser/goreleaser.mmake
BINARY := myapp
VERSION := 0.1.0
.PHONY: release
release: goreleaser ## Build and release using goreleaser
2. 条件执行
.PHONY: deploy
deploy: ## Deploy based on environment
ifeq ($(ENV),production)
@echo "Deploying to production"
@kubectl apply -f k8s/production
else
@echo "Deploying to staging"
@kubectl apply -f k8s/staging
endif
3. 自动文档生成
mmake可以自动为你的构建任务生成文档:
mmake help
这会显示所有带有##
注释的任务及其描述。
实际项目示例
以下是一个完整的mmakefile示例:
include $(GOPATH)/src/github.com/tj/mmake/base.mmake
BINARY := myapp
VERSION := 0.1.0
DOCKER_REPO := myorg
.PHONY: build
build: deps ## Build the binary
@echo "Building $(BINARY) v$(VERSION)"
@go build -o $(BINARY) ./cmd/$(BINARY)
.PHONY: test
test: deps ## Run tests
@go test -v ./...
.PHONY: cover
cover: deps ## Run tests with coverage
@go test -coverprofile=coverage.out ./...
@go tool cover -html=coverage.out -o coverage.html
.PHONY: lint
lint: ## Run linters
@golangci-lint run ./...
.PHONY: deps
deps: ## Install dependencies
@go mod download
@go mod tidy
.PHONY: docker
docker: ## Build docker image
@docker build -t $(DOCKER_REPO)/$(BINARY):$(VERSION) .
@docker tag $(DOCKER_REPO)/$(BINARY):$(VERSION) $(DOCKER_REPO)/$(BINARY):latest
.PHONY: push
push: docker ## Push docker image
@docker push $(DOCKER_REPO)/$(BINARY):$(VERSION)
@docker push $(DOCKER_REPO)/$(BINARY):latest
.PHONY: clean
clean: ## Clean build artifacts
@rm -f $(BINARY)
@rm -f coverage.out coverage.html
总结
mmake为Golang项目提供了一种现代化、模块化的构建方式,相比传统Makefile具有以下优势:
- 更简洁的语法
- 更好的模块化和代码重用
- 内置Golang项目常用任务
- 易于扩展的插件系统
- 自动文档生成
通过合理使用mmake,可以显著简化Golang项目的构建和部署流程,提高开发效率。