golang标准模块开发模板插件go-module的使用

Golang标准模块开发模板插件go-module的使用

简介

go-module是一个用于快速创建新Go模块的模板项目。它不仅为新项目提供了起点,还配备了预配置的CI/CD和工具集。

Go Module

快速开始

使用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 ./...

如何构建自己的模块

  1. 从模板生成一个新仓库
  2. 本地克隆该仓库
  3. 根据需要更新文件,例如:run init my.new/module
  4. 编写代码和测试
  5. 发布

示例代码

下面是一个简单的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

生态系统

包含的工具

  1. Nextra - 文档生成工具
  2. Makefiles - 构建工具
  3. Taskfiles - 任务运行器
  4. Go工具链:mockgen、golangci-lint、goimports、govulncheck

预配置的服务

  1. GitHub Actions
  2. GitHub Pages
  3. Dependabot

动机

OctoLab团队希望使用最佳实践更快地启动新项目,专注于核心思想的实现,而不是浪费时间在环境配置和复制样板代码上。


更多关于golang标准模块开发模板插件go-module的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于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 buildgo test 时,Go 会自动下载依赖并更新 go.modgo.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"

最佳实践

  1. go.modgo.sum 提交到版本控制
  2. 使用明确的版本号而不是 latest
  3. 定期运行 go mod tidy 保持依赖整洁
  4. 对于生产环境,考虑使用 go mod vendor 将依赖本地化
  5. 使用 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 项目开发的基础工具。

回到顶部