golang标准模块开发模板插件go-module的使用
Golang标准模块开发模板插件go-module的使用
简介
go-module是一个用于快速创建新Go模块的模板项目。它不仅为新项目提供了起点,还配备了预配置的CI/CD和工具集。
快速开始
使用Makefile
$ make setup
$ make help
$ make find-todos
$ make test lint
$ TIMEOUT=5s make test-with-coverage
使用Taskfile
$ alias run=./Taskfile
$ run refresh
$ run help
$ run docs # === `run docs install -- build -- start`
$ run docs npm ci
$ run docs npm i nextra@latest
$ run tools go generate tools.go
$ run tools golangci-lint --version -- mockgen --version
$ run which goimports golangci-lint govulncheck mockgen
使用工具
$ make tools
$ source bin/activate
$ which goimports
$ goimports -local $(go list -m) -w ./...
如何构建自己的模块
- 从模板生成一个新仓库
- 本地克隆该仓库
- 根据需要更新文件,例如:
run init my.new/module
- 编写代码和测试
- 发布
示例代码
下面是一个简单的Go模块示例,展示如何使用go-module模板:
// main.go
package main
import (
"fmt"
"go.octolab.org/template/module"
)
func main() {
fmt.Println("Welcome to my Go module!")
fmt.Printf("Module version: %s\n", module.Version())
}
// module/module.go
package module
// Version returns the current version of the module
func Version() string {
return "v1.0.0"
}
集成
项目使用SemVer进行版本控制,建议使用Go Modules管理依赖:
$ go get go.octolab.org@latest
生态系统
包含的工具
- Nextra - 文档生成工具
- Makefiles - 构建工具
- Taskfiles - 任务运行器
- Go工具链:mockgen、golangci-lint、goimports、govulncheck
预配置的服务
- GitHub Actions
- GitHub Pages
- Dependabot
动机
OctoLab团队希望使用最佳实践更快地启动新项目,专注于核心思想的实现,而不是浪费时间在环境配置和复制样板代码上。
更多关于golang标准模块开发模板插件go-module的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang标准模块开发模板插件go-module的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Go Module 使用指南
Go Module 是 Go 1.11 引入的官方依赖管理系统,用于管理项目依赖和版本控制。下面我将详细介绍 Go Module 的使用方法,并提供相关示例代码。
基本使用
1. 初始化新模块
// 在项目根目录执行
go mod init <module-path>
例如:
go mod init github.com/username/projectname
这会创建一个 go.mod
文件,内容类似:
module github.com/username/projectname
go 1.16
2. 添加依赖
当你的代码中 import 了外部包并运行 go build
或 go test
时,Go 会自动下载依赖并更新 go.mod
和 go.sum
文件。
你也可以手动添加依赖:
go get github.com/gin-gonic/gin@v1.7.4
3. 常用命令
# 下载所有依赖
go mod download
# 整理依赖,移除不需要的依赖
go mod tidy
# 查看依赖关系
go mod graph
# 验证依赖的完整性
go mod verify
# 将依赖复制到vendor目录
go mod vendor
进阶使用
1. 替换依赖
在 go.mod
中可以使用 replace
指令替换依赖:
replace (
github.com/old/package => github.com/new/package v1.2.3
golang.org/x/text => ./local/text
)
2. 排除特定版本
exclude (
github.com/some/package v1.2.3
)
3. 间接依赖
间接依赖(indirect)表示该依赖不是直接被你的模块使用,而是被你的依赖所依赖。
示例项目结构
myproject/
├── go.mod
├── go.sum
├── main.go
├── pkg/
│ ├── utils/
│ │ ├── math.go
│ │ └── strings.go
│ └── api/
│ ├── handler.go
│ └── router.go
└── cmd/
├── server/
│ └── main.go
└── client/
└── main.go
版本控制
Go Module 使用语义化版本控制 (SemVer):
v0.0.0
- 初始开发版本,API不稳定v1.0.0
- 首个稳定版本v2.0.0
- 包含破坏性变更的版本
对于 v2+ 版本,模块路径需要添加版本后缀:
module github.com/username/projectname/v2
私有仓库支持
要使用私有仓库,可以设置 GOPRIVATE 环境变量:
go env -w GOPRIVATE=github.com/yourcompany/*
对于需要认证的仓库,可以配置 git:
git config --global url."https://${GITHUB_TOKEN}@github.com".insteadOf "https://github.com"
最佳实践
- 将
go.mod
和go.sum
提交到版本控制 - 使用明确的版本号而不是
latest
- 定期运行
go mod tidy
保持依赖整洁 - 对于生产环境,考虑使用
go mod vendor
将依赖本地化 - 使用
go list -m all
查看所有依赖
完整示例
// main.go
package main
import (
"fmt"
"log"
"github.com/gin-gonic/gin"
"github.com/username/projectname/pkg/utils"
)
func main() {
fmt.Println("Sum:", utils.Add(1, 2))
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
log.Fatal(r.Run(":8080"))
}
// pkg/utils/math.go
package utils
func Add(a, b int) int {
return a + b
}
对应的 go.mod
可能如下:
module github.com/username/projectname
go 1.16
require (
github.com/gin-gonic/gin v1.7.4
)
通过以上介绍,你应该已经掌握了 Go Module 的基本使用方法。Go Module 大大简化了 Go 项目的依赖管理,是现代 Go 项目开发的基础工具。