golang快速启动生产级项目模板插件库cookiecutter-golang的使用

cookiecutter-golang

Build Status

基于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

限制

  • 使用depmod进行依赖管理
  • 仅使用维护中的第三方库

该项目现在使用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

1 回复

更多关于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

自定义模板

如果你想基于此模板创建自己的模板:

  1. Fork cookiecutter-golang仓库
  2. 修改cookiecutter.json文件中的默认值
  3. 调整项目结构模板
  4. 提交到自己的仓库

示例代码

生成的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")
}

优势特点

  1. 生产就绪:包含日志、配置管理、健康检查等生产必备功能
  2. 标准化结构:遵循Go社区最佳实践的项目布局
  3. CI/CD集成:预置GitHub Actions工作流
  4. 多环境支持:开发、测试、生产环境配置分离
  5. Docker支持:优化的Dockerfile和多阶段构建

通过使用cookiecutter-golang,你可以跳过项目初始化阶段的繁琐工作,直接专注于业务逻辑开发。

回到顶部