golang快速启动生产级项目模板插件库cookiecutter-golang的使用
cookiecutter-golang
基于Cookiecutter构建,cookiecutter-golang是一个快速启动生产级Go项目的框架。
特性
- 包含丰富管理命令的
Makefile
- 使用
go dep
(可选支持go module,需要go 1.11+) - 在构建时注入构建时间和git hash
可选集成
- 可以使用
viper
进行环境变量配置 - 可以使用
cobra
构建CLI工具 - 可以使用
logrus
进行日志记录 - 可以创建用于构建Go二进制文件的dockerfile和最终Go二进制文件的dockerfile(最终容器中不包含代码)
- 如果使用docker,会将docker管理命令添加到makefile中
- 可选择TravisCI、CircleCI或不使用CI
限制
- 使用
dep
或mod
进行依赖管理 - 仅使用维护中的第三方库
该项目现在使用docker多阶段构建,您至少需要docker版本v17.05.0-ce才能使用此模板中的docker文件。
Docker
此模板使用docker多阶段构建来使镜像更精简,容器仅包含最终项目二进制文件和资源,不包含任何源代码。
应用程序在非root用户下运行,并使用dumb-init
。
使用示例
假设您想创建一个名为"echoserver"的项目。与其从头开始创建,不如让cookiecutter完成所有工作。
首先,安装Cookiecutter:
$ pip install cookiecutter
或者使用homebrew安装:
$ brew install cookiecutter
然后,基于此模板运行:
$ cookiecutter https://github.com/lacion/cookiecutter-golang.git
系统会询问您的基本信息(姓名、项目名称、应用名称等)。这些信息将用于定制您的新项目。
警告:在此之后,请将’Luis Morales’、'lacion’等更改为您自己的信息。
根据提示输入您想要的选项。例如:
full_name [Luis Morales]: Luis Morales
github_username [lacion]: lacion
app_name [mygolangproject]: echoserver
project_short_description [A Golang project.]: Awesome Echo Server
docker_hub_username [lacion]: lacion
docker_image [lacion/docker-alpine:latest]: lacion/docker-alpine:latest
docker_build_image [lacion/docker-alpine:gobuildimage]: lacion/docker-alpine:gobuildimage
use_docker [y]: y
use_git [y]: y
use_logrus_logging [y]: y
use_viper_config [y]: y
use_cobra_cmd [y]: y
Select use_ci:
1 - travis
2 - circle
3 - none
Choose from 1, 2, 3 [1]: 1
进入项目并查看:
$ cd echoserver/
$ ls
运行make help
查看可用的管理命令,或者直接运行make build
构建您的项目。
$ make help
$ make build
$ ./bin/echoserver
使用cookiecutter-golang构建的项目
- iothub - 用于IoT的websocket多房间服务器
更多关于golang快速启动生产级项目模板插件库cookiecutter-golang的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang快速启动生产级项目模板插件库cookiecutter-golang的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用cookiecutter-golang快速启动生产级Go项目
cookiecutter-golang 是一个基于Cookiecutter的Go项目模板,可以帮助开发者快速搭建符合生产标准的Go项目结构。下面我将详细介绍如何使用它。
安装准备
首先需要安装Cookiecutter工具:
# 使用pip安装
pip install cookiecutter
# 或者使用brew(MacOS)
brew install cookiecutter
创建新项目
使用cookiecutter-golang模板创建新项目:
cookiecutter https://github.com/lacion/cookiecutter-golang.git
执行命令后,会提示你输入一些项目配置信息:
project_name [myproject]: myawesomeapp
project_short_description [My Go project]: An awesome Go microservice
docker_image [lacion/myawesomeapp]: mydockerhub/myawesomeapp
docker_build_image [golang:1.18]: golang:1.19
Select go_mod_module:
1 - github.com/lacion/myawesomeapp
2 - gitlab.com/lacion/myawesomeapp
3 - bitbucket.org/lacion/myawesomeapp
4 - custom
Choose from 1, 2, 3, 4 [1]: 4
go_mod_module_custom [github.com/lacion/myawesomeapp]: github.com/myusername/myawesomeapp
Select use_github_actions:
1 - yes
2 - no
Choose from 1, 2 [1]: 1
项目结构解析
生成的项目会包含以下主要目录和文件:
.
├── Makefile # 常用命令封装
├── README.md
├── api # API定义(如gRPC/protobuf)
├── assets # 静态资源
├── build # 构建相关文件
├── cmd # 主程序入口
│ └── myawesomeapp
│ └── main.go
├── configs # 配置文件
├── deployments # 部署文件(k8s, docker-compose等)
├── docs # 文档
├── examples # 示例代码
├── go.mod
├── go.sum
├── internal # 私有应用代码
│ ├── app # 应用初始化
│ ├── config # 配置处理
│ ├── handler # HTTP处理器
│ ├── model # 数据模型
│ └── service # 业务逻辑
├── pkg # 可公开的库代码
├── scripts # 脚本文件
├── test # 测试相关
└── vendor # 依赖包(可选)
常用命令
模板生成的Makefile提供了常用命令:
# 构建项目
make build
# 运行测试
make test
# 运行项目
make run
# 清理构建文件
make clean
# 构建Docker镜像
make docker
# 代码格式化
make fmt
# 静态代码检查
make lint
# 生成代码覆盖率报告
make cover
自定义模板
如果你想基于此模板创建自己的模板:
- Fork cookiecutter-golang仓库
- 修改
cookiecutter.json
文件中的默认值 - 调整项目结构模板
- 提交到自己的仓库
示例代码
生成的main.go
文件通常如下:
package main
import (
"context"
"fmt"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"github.com/myusername/myawesomeapp/internal/app"
"github.com/myusername/myawesomeapp/internal/config"
)
func main() {
// 加载配置
cfg, err := config.Load()
if err != nil {
log.Fatalf("Failed to load config: %v", err)
}
// 初始化应用
application, err := app.New(cfg)
if err != nil {
log.Fatalf("Failed to initialize application: %v", err)
}
// 创建HTTP服务器
srv := &http.Server{
Addr: fmt.Sprintf(":%d", cfg.Server.Port),
Handler: application.Handler(),
}
// 优雅关闭
done := make(chan os.Signal, 1)
signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
go func() {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("Failed to start server: %v", err)
}
}()
log.Printf("Server started on port %d", cfg.Server.Port)
<-done
log.Print("Server stopped")
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
log.Fatalf("Server shutdown failed: %v", err)
}
log.Print("Server exited properly")
}
优势特点
- 生产就绪:包含日志、配置管理、健康检查等生产必备功能
- 标准化结构:遵循Go社区最佳实践的项目布局
- CI/CD集成:预置GitHub Actions工作流
- 多环境支持:开发、测试、生产环境配置分离
- Docker支持:优化的Dockerfile和多阶段构建
通过使用cookiecutter-golang,你可以跳过项目初始化阶段的繁琐工作,直接专注于业务逻辑开发。