经常在GoRust之间切换,很喜欢RustCargo带来的优秀项目初始化和构建体验:

cargo new <appName> # 一键创建标准项目
cargo build # 统一构建流程

但回到Go时,虽然go mod很好,但项目初始化、结构规范、构建优化这些事,总是要手动操作。
于是,通过将Cargo的部分理念带到Go生态中。通过倒反天罡,写了gocar:简化Go项目“创建-构建”流程的命令行工具。它不替代go命令,而是作为补充,提供更一致、更便捷的起点。

项目已开源:https://github.com/uselibrary/gocar

以下是当前的示例,欢迎PR/issue:

快速开始

# 创建新项目(简洁模式)
gocar new myapp

# 进入项目目录
cd myapp

# 构建项目
gocar build

# 运行项目
gocar run

# 清理构建产物
gocar clean

命令

gocar new <name> [--mode simple|project]

创建新的 Go 项目。

参数:

  • <name> - 项目名称,同时作为目录名和输出的可执行文件名
  • --mode - 项目模式,可选 simple(默认)或 project

项目名规则:

  • 必须以字母开头
  • 只能包含字母、数字、下划线 _ 或连字符 -
  • 不能使用保留名称:testmaininitinternalvendor

示例:

# 创建简洁模式项目(默认)
gocar new myapp

# 创建项目模式项目
gocar new myserver --mode project

gocar build [--release]

构建当前项目。

参数:

  • --release 可选,使用之后即以CGO=0模式构建并优化体积

构建行为:

模式命令等价
Debug(默认)go build -o bin/<appName> ./main.go
ReleaseCGO_ENABLED=0 go build -ldflags="-s -w" -trimpath -o bin/<appName> ./main.go
项目模式下入口为 ./cmd/server/main.go

示例:

# Debug 构建
gocar build

# Release 构建(CGO=0模式构建并优化体积)
gocar build --release

gocar run [args...]

直接运行当前项目(使用 go run)。

示例:

# 运行项目
gocar run

# 传递参数给应用
gocar run --port 8080

gocar clean

清理 bin/ 目录中的构建产物。

示例:

gocar clean
# Cleaned build artifacts for 'myapp'

gocar help

显示帮助信息。

gocar version

显示版本信息。


项目模式

简洁模式(Simple)

适用于小型项目、脚本、CLI 工具等。

myapp/
├── go.mod
├── main.go
├── README.md
├── bin/
├── .gitignore
└── .git/

main.go 模板:

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("Hello, gocar! A golang package manager.")
    fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
}

项目模式(Project)

适用于大型项目、Web 服务、微服务等,遵循 Go 标准项目布局。

myapp/
├── cmd/
│   └── server/
│       └── main.go      # 应用入口
├── internal/            # 私有代码(不可被外部导入)
├── pkg/                 # 公共库代码
├── test/                # 集成测试
├── bin/                 # 构建输出
├── go.mod
├── README.md
├── .gitignore
└── .git/

cmd/server/main.go 模板:

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("Hello, gocar! A golang package manager.")
    fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
}

目录说明:

  • cmd/ - 应用程序入口
  • internal/ - 私有代码,仅本模块内部使用(Go 编译器强制)
  • pkg/ - 可被外部项目导入的公共库
  • test/ - 集成测试、端到端测试

特性

  • 自动 Git 初始化 - 创建项目时自动执行 git init -b main 并生成 .gitignore,需要已经安装git
  • 项目名验证 - 确保项目名符合 Go 规范
  • Release 优化 - 使用 -ldflags="-s -w" -trimpath 减小二进制体积
  • 跨平台支持 - AMD64及aarch64的Windows、Linux 和 macOS
  • 清理命令 - 一键清理构建产物

标签: go

添加新评论