在Go语言项目中,编写启动脚本 (`.sh` 文件) 通常用于自动化启动Go程序、配置环境变量、执行一些初始化任务或处理不同环境下的配置。下面是编写和配置启动脚本的步骤。
### 1. 基本的 `.sh` 启动脚本
假设你已经在 Go 中编写了应用程序并编译为二进制文件,启动脚本 `.sh` 主要负责执行这些二进制文件。以下是一个基本的启动脚本的示例:
#### 示例 1: 基本启动脚本 (`start.sh`)
```bash
#!/bin/bash
# 设置环境变量
export GO_ENV=dev
# 确保 .env 文件存在
if [ ! -f .env ]; then
echo "创建 .env 文件..."
cp .env.example .env
fi
# 停止已存在的进程
echo "停止现有进程..."
pkill -f "classin-api"
# 编译并运行
echo "开始编译..."
go build -o classin-api
echo "启动服务..."
./classin-api
# 启动Go应用程序
./classin-api
```
### 2. 配置文件与环境变量
#### 使用 `.env` 文件
你可以通过在脚本中使用 `godotenv` 加载 `.env` 文件中的环境变量。假设你使用 Go 代码中的 `godotenv` 库来加载 `.env` 文件。你可以在启动脚本中设置环境变量并运行 Go 程序:
#### 示例 2: 使用 `.env` 文件加载环境变量
假设你有一个 `.env` 文件,内容如下:
```
# 开发环境 dev
# 测试环境 test
# 预发环境 pre
# 生产环境 prod
GO_ENV=dev
```
启动脚本 (`start.sh`) 如下:
./start.sh
```bash
#!/bin/bash
# 颜色定义
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 检查必要的工具
echo -e "${YELLOW}检查必要的工具...${NC}"
command -v go >/dev/null 2>&1 || { echo "需要安装 Go 但未找到,请先安装 Go"; exit 1; }
command -v docker >/dev/null 2>&1 || { echo "需要安装 Docker 但未找到,请先安装 Docker"; exit 1; }
# 设置环境变量
export GO_ENV=dev
export GO111MODULE=on
export GOPROXY=https://goproxy.cn,direct
# 确保 .env 文件存在
if [ ! -f .env ]; then
echo -e "${YELLOW}创建 .env 文件...${NC}"
if [ -f .env.example ]; then
cp .env.example .env
echo -e "${GREEN}.env 文件已创建${NC}"
else
echo "错误:.env.example 文件不存在"
exit 1
fi
fi
# 启动必要的 Docker 服务(如 RabbitMQ)
echo -e "${YELLOW}检查 Docker 服务...${NC}"
if ! docker ps | grep -q rabbitmq; then
echo "启动 RabbitMQ..."
docker run -d --name rabbitmq \
-p 5672:5672 \
-p 15672:15672 \
rabbitmq:3-management
fi
# 停止已存在的进程
echo -e "${YELLOW}停止现有进程...${NC}"
pkill -f "classin-api" || true
# 更新依赖
echo -e "${YELLOW}更新依赖...${NC}"
go mod tidy
# 编译
echo -e "${YELLOW}开始编译...${NC}"
go build -o classin-api
# 运行服务
echo -e "${GREEN}启动服务...${NC}"
./classin-api
这个脚本会:
- 检查必要的工具是否安装
- 设置必要的环境变量
- 确保 .env 文件存在
- 启动必要的 Docker 服务(如 RabbitMQ)
- 停止已存在的进程
- 更新依赖
- 编译并运行服务
如果你使用 Docker Compose,可以这样修改:
#!/bin/bash
# 颜色定义
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# 设置环境变量
export GO_ENV=dev
# 确保 .env 文件存在
if [ ! -f .env ]; then
echo -e "${YELLOW}创建 .env 文件...${NC}"
cp .env.example .env
fi
# 使用 docker-compose
echo -e "${YELLOW}启动 Docker 服务...${NC}"
docker-compose up -d
# 编译并运行
echo -e "${YELLOW}开始编译...${NC}"
go build -o classin-api
echo -e "${GREEN}启动服务...${NC}"
./classin-api
# 启动Go应用程序
./my-go-app
```
使用提示:
- 将脚本放在项目根目录
- 确保有 .env.example 作为环境变量模板
- 根据实际需求修改脚本中的服务配置
- 如果遇到权限问题,使用 chmod +x start-dev.sh 添加执行权限
错误处理:
- 如果脚本执行失败,检查错误信息
- 确保所有必要的服务都已启动
- 检查端口是否被占用
- 查看日志文件了解详细错误信息
这里使用了 `export $(grep -v '^#' .env | xargs)` 来加载 `.env` 文件中的所有环境变量。`grep -v '^#'` 用于排除注释行,`xargs` 将每个键值对转换为 `export` 命令。
### 3. 其他常见操作
#### 日志输出
你可以将应用程序的输出日志到文件,以便调试或记录日志。例如:```bash
#!/bin/bash
# 设置环境变量
export ENVIRONMENT=production
# 打印日志到文件
echo "Starting Go Application" > app.log
echo "Environment: $ENVIRONMENT" >> app.log
# 启动Go应用程序并将输出重定向到日志文件
./my-go-app >> app.log 2>&1
```
#### 后台运行程序
有时你可能希望Go应用在后台运行。你可以通过 `&` 运算符来启动进程:```bash
#!/bin/bash
# 设置环境变量
export ENVIRONMENT=production
# 启动Go应用程序并让其在后台运行
./my-go-app &
```
### 4. 配置和执行权限
#### 1. 使脚本文件可执行
确保 `.sh` 脚本有执行权限。在终端中使用以下命令给脚本添加执行权限:
```bash
chmod +x start.sh
```
#### 2. 执行脚本
使用以下命令执行脚本:
```bash
./start.sh
```
### 5. 处理不同的环境
你可能需要根据不同的环境配置(例如开发、测试、生产)来启动应用程序。在这种情况下,启动脚本可以根据传入的环境变量选择不同的配置文件或执行不同的命令。
#### 示例 3: 处理不同的环境```bash
#!/bin/bash
# 检查环境参数
if [ "$1" == "dev" ]; then
echo "Starting in Development Mode"
export ENVIRONMENT=development
export DB_HOST=localhost
export DB_PORT=5432
elif [ "$1" == "prod" ]; then
echo "Starting in Production Mode"
export ENVIRONMENT=production
export DB_HOST=prod-db-host
export DB_PORT=5432
else
echo "Unknown environment. Usage: ./start.sh [dev|prod]"
exit 1
fi
# 启动Go应用程序
./my-go-app
```
你可以通过传递 `dev` 或 `prod` 参数来选择不同的环境配置:```bash
# 开发环境
./start.sh dev
# 生产环境
./start.sh prod
```
### 6. 使用 `systemd` 配置服务(可选)
在 Linux 系统上,常见的做法是使用 `systemd` 来管理 Go 应用程序的启动与停止。如果你需要将 Go 应用程序作为服务运行,可以创建一个 `systemd` 单元文件。
#### 示例 4: `systemd` 配置
1. 创建一个 `my-go-app.service` 文件,放置在 `/etc/systemd/system/` 目录下:```ini
[Unit]
Description=My Go Application
After=network.target
[Service]
ExecStart=/path/to/my-go-app
WorkingDirectory=/path/to/your/project
EnvironmentFile=/path/to/.env
Restart=always
User=youruser
Group=yourgroup
[Install]
WantedBy=multi-user.target
```
2. 使 `systemd` 重新加载服务配置并启动服务:```bash
# 重新加载 systemd 服务
sudo systemctl daemon-reload
# 启动 Go 服务
sudo systemctl start my-go-app.service
# 设置开机自动启动
sudo systemctl enable my-go-app.service
```
### 总结
Go 应用程序的启动脚本(`.sh` 文件)通常包括以下几个步骤:
1. 设置环境变量(从 `.env` 文件或直接在脚本中)。
2. 启动 Go 应用程序(通过执行编译后的二进制文件)。
3. 配置日志输出和后台运行。
4. 在需要的情况下,配置不同的环境启动不同的配置。
通过这些配置,你可以方便地管理 Go 应用程序的启动过程,并确保在不同环境下运行时能够正确加载配置和依赖。