CentOS编译Go项目步骤
小樊
45
2025-11-14 04:26:55
在 CentOS 上编译 Go 项目的标准流程
一 准备环境
- 更新系统并安装基础工具(可选但推荐):
- sudo yum update -y
- sudo yum install -y wget git gcc make
- 安装 Go(两种常用方式,二选一)
- 使用包管理器安装(CentOS 7/8/Stream 可用):
- sudo yum install -y golang # CentOS 7
- sudo dnf install -y golang # CentOS 8/Stream
- 手动安装官方二进制包(便于指定版本):
- wget https://golang.org/dl/go1.22.5.linux-amd64.tar.gz
- sudo tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz
- 配置环境变量(写入 ~/.bashrc 或 /etc/profile,二选一)
- echo ‘export PATH=$PATH:/usr/local/go/bin’ >> ~/.bashrc
- source ~/.bashrc
- 验证安装:go version(应输出版本号,如 go1.22.5)
二 拉取代码与准备依赖
- 进入项目目录并初始化模块(若项目根目录没有 go.mod):
- go mod init # 例如:go mod init example.com/mymodule
- 下载依赖(建议在项目根目录执行):
- 说明:Go 1.11+ 默认启用 Go Modules,通常无需再设置 GOPATH;如维护老项目可按需设置 GOPATH。
三 本地编译与运行
- 在项目根目录执行(确保存在 package main 的入口):
- 编译:go build -o myapp main.go # 生成可执行文件 myapp
- 运行:./myapp
- 常用构建参数
- -o:指定输出文件名或路径
- -v:打印编译的包名
- -x:打印执行的命令(便于排错)
- -race:启用数据竞争检测(仅 amd64 等支持平台)
- -ldflags:链接期参数,常用 -s -w 减小体积,-X 注入变量
- 示例(注入版本与构建环境并减小体积)
- go build -o myapp
-ldflags “-s -w -X main.Version=1.2.3 -X main.BuildEnv=prod”
-v ./cmd/myapp
四 交叉编译与产物打包
- 交叉编译为 Linux amd64(在 macOS/Windows 或另一台 Linux 上构建时常用)
- GOOS=linux GOARCH=amd64 go build -o myapp-linux-amd64 main.go
- 常见目标平台示例
- Linux amd64:GOOS=linux GOARCH=amd64
- Windows amd64:GOOS=windows GOARCH=amd64
- macOS amd64:GOOS=darwin GOARCH=amd64
- 将可执行文件与配置打包
- tar -czvf myapp-linux-amd64.tar.gz myapp-linux-amd64 config/ scripts/
五 运行与发布建议
- 直接运行与后台启动
- chmod +x myapp
- nohup ./myapp > app.log 2>&1 &
- 使用 systemd 托管(推荐用于生产)
- 创建服务文件:/etc/systemd/system/myapp.service
- [Unit]
- Description=My Go Application
- After=network.target
- [Service]
- User=your_user
- WorkingDirectory=/opt/myapp
- ExecStart=/opt/myapp/myapp
- Restart=always
- Environment=APP_ENV=production
- [Install]
- WantedBy=multi-user.target
- 启用与启动
- sudo systemctl daemon-reload
- sudo systemctl enable --now myapp
- 防火墙放行(如对外提供 80/443)
- sudo firewall-cmd --permanent --add-service=http
- sudo firewall-cmd --permanent --add-service=https
- sudo firewall-cmd --reload