-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.go
More file actions
46 lines (42 loc) · 2.17 KB
/
Copy pathmain.go
File metadata and controls
46 lines (42 loc) · 2.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// base-code 是数据库代码生成器的 CLI 入口。
//
// Go 小白知识点:
// - 可执行程序必须在 package main 中,且必须有 func main()。
// - main 包的 import 路径无法被其他包导入,只能作为程序入口。
// - os.Exit(1) 立即终止进程并返回退出码 1(非零)。
// Unix 约定:0=成功,非零=失败。CI/CD 脚本通过 $? 检查退出码。
// 注意:os.Exit 不执行 defer,因此不在 main 中 defer,而由 cmd 层管理资源。
package main
import (
"fmt"
"os"
"github.com/dhslegen/base-code/cmd"
)
// version 由构建期注入:goreleaser 在 .goreleaser.yaml 的 ldflags 里写
// -X main.version={{.Version}},把 tag 上的版本号(如 0.8.0)改写进这个变量。
// 直接 go build / go run 时不注入,保持空串,cmd 侧会回落到缺省的 dev。
//
// Go 小白知识点:-X 只能改写「包级 string 变量」的初值,不能改常量(const)、
// 也不能改其他类型——所以这里必须是 var 且必须是 string。
var version string
func main() {
// 把构建期版本号交给根命令,使 `base-code --version` 可用。
cmd.SetVersion(version)
// cmd.Execute() 启动 cobra 命令树,解析 os.Args 并执行对应子命令。
// 若命令执行失败(RunE 返回 error),cobra 已打印 "Error: ..." 到 stderr,
// Execute() 也会返回该 error。
if err := cmd.Execute(); err != nil {
// 再次将错误信息写到 stderr(格式化为中文,方便用户阅读)。
// fmt.Fprintln(os.Stderr, ...) vs fmt.Println(...):
// - fmt.Println 写 stdout(标准输出,用于正常程序输出)
// - fmt.Fprintln(os.Stderr, ...) 写 stderr(标准错误,用于错误/诊断信息)
// 脚本/管道通常把 stdout 和 stderr 分开处理,错误应写 stderr。
fmt.Fprintln(os.Stderr, "错误:", err)
// os.Exit(1) 以非零退出码退出。
// 非零退出码的价值:
// - Shell 脚本:`base-code gen ... || exit 1`(出错时终止后续命令)
// - CI/CD:构建系统检测到非零退出码,自动标记构建失败
// - AI Agent:可读取退出码判断命令是否成功
os.Exit(1)
}
}