go语言zero框架中启动脚本.sh的编写与配置

news2024/12/21 18:27:30

在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 应用程序的启动过程,并确保在不同环境下运行时能够正确加载配置和依赖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2263364.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React,Antd实现文本输入框话题添加及删除的完整功能解决方案

最终效果就是实现该输入框: 添加话题时,话题自动插入到输入框前面多文本输入框左侧间距为话题的宽度多行文本时,第二行紧接开头渲染删除文本时,如果删除到话题,再次删除,话题被删除 首先构造div结构 cons…

坑人 C# MySql.Data SDK

一:背景 1. 讲故事 为什么说这东西比较坑人呢?是因为最近一个月接到了两个dump,都反应程序卡死无响应,最后分析下来是因为线程饥饿导致,那什么原因导致的线程饥饿呢?进一步分析发现罪魁祸首是 MySql.Data,这就让人无语了,并且反馈都是升级了MySql.Data驱动引发,接下…

(五)FT2232HL高速调试器之--三步实现STM32的VSCODE在线仿真工程搭建

对于单片机开发,rtthread studios 与 vscode,鱼与熊掌可以兼得否,其实是可以的,下面通过三个步骤,实现基于FT2232HL高速调试器的,stm32的VSCODE在线仿真工程的搭建。 1、软件下载与VSCODE插件安装配置 软…

【计算机网络】lab2 Ethernet(链路层Ethernet frame结构细节)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀计算机网络_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2.…

鸿蒙项目云捐助第十讲鸿蒙App应用分类页面二级联动功能实现

鸿蒙项目云捐助第十讲鸿蒙App应用分类页面二级联动功能实现 在之前的教程中完成了分类页面的左右两侧的列表结构,如下图所示。 接下来需要实现左侧分类导航项的点击操作,可以友好的提示用户选择了哪一个文字分类导航项。 一、左侧文字分类导航的处理 …

数字IC后端零基础入门基础理论(Day1)

数字IC后端设计导入需要用到的input数据如下图所示。 数字后端零基础入门系列 | Innovus零基础LAB学习Day9 Netlist: 设计的Gate level(门级)网表。下图所示为一个计数器设计综合后的门级netlist。 从这个netlist中我们看到这个设计顶层的名字叫counte…

如何编译Opencv +ffmpeg linux 明明安装了ffmpeg但是opencv就是找不到

想要编译opencvffmpeg: 1.安装ffmpeg 随便位置(具体看ffmpeg 编译安装) 执行下面命令,其中/usr/local/ffmpeg/lib/pkgconfig是你实际的ffmpeg路径 export PKG_CONFIG_PATH$PKG_CONFIG_PATH:/usr/local/ffmpeg/lib/pkgconfig2.下载…

三维视频融合在数字孪生中的应用

一、在提升监控效率与决策准确性方面的应用 改善监控视角与理解:在数字孪生场景下,三维视频融合技术能够将监控视频与三维环境相结合。例如在城市安防、工业生产、大型活动等场景中,形成连续、实时、动态的三维全景拼接图。这解决了传统监控…

语音识别失败 chrome下获取浏览器录音功能,因为安全性问题,需要在localhost或127.0.0.1或https下才能获取权限

环境: Win10专业版 谷歌浏览器 版本 131.0.6778.140(正式版本) (64 位) 问题描述: 局域网web语音识别出现识别失败 chrome控制台出现下获取浏览器录音功能,因为安全性问题,需要在…

计算机网络-传输层 TCP协议(上)

目录 报头结构 TCP的可靠传输机制 核心机制一:确认应答 TCP的序号和确认序号 核心机制二:丢包重传 核心机制三:连接管理 建立连接-三次握手 断开连接-四次挥手 核心机制四:滑动窗口 数据包已经抵达, ACK被丢了 数据包就…

【Cadence射频仿真学习笔记】IC设计中电感的分析、建模与绘制(EMX电磁仿真,RFIC-GPT生成无源器件及与cadence的交互)

一、理论讲解 1. 电感设计的两个角度 电感的设计可以从两个角度考虑,一个是外部特性,一个是内部特性。外部特性就是把电感视为一个黑盒子,带有两个端子,如果带有抽头的电感就有三个端子,需要去考虑其电感值、Q值和自…

AutoSarOS中调度表的概念与源代码解析

--------AutoSarOS调度表的概念 一、AutoSarOS 是什么以及调度表的重要性 AutoSar(Automotive Open System Architecture)是汽车行业的一个开放式软件架构标准哦。它就像是一种大家都遵循的规则,能让不同的软件供应商一起合作开发汽车软件,这样软件就能被重复使用,开发效…

对golang的io型进程进行off-cpu分析

背景: 对于不能占满所有cpu核数的进程,进行on-cpu的分析是没有意义的,因为可能程序大部分时间都处在阻塞状态。 实验例子程序: 以centos8和golang1.23.3为例,测试下面的程序: pprof_netio.go package m…

VS项目,在生成的时候自动修改版本号

demo示例:https://gitee.com/chenheze90/L28_AutoVSversion 可通过下载demo运行即可。 原理:通过csproject项目文件中的Target标签,实现在项目编译之前对项目版本号进行修改,避免手动修改; 1.基础版 效果图如下 部…

springcloud-gateway获取应用响应信息乱码

客户端通过springcloud gateway跳转访问tongweb上的应用,接口响应信息乱码。使用postman直接访问tongweb上的应用,响应信息显示正常。 用户gateway中自定义了实现GlobalFilter的Filter类,在该类中获取了上游应用接口的响应信息,直…

node安装,npm安装,vue-cli安装以及element-ui配置项目

node.js Node.js主要用于开发高性能、高并发的网络服务器,特别适合构建HTTP服务器、实时交互应用(如聊天室)和RESTful API服务器等。‌它使用JavaScript语言,基于Chrome V8引擎,提供模块化开发和丰富的npm生态系统&…

新能源汽车充电需求攀升,智慧移动充电服务有哪些实际应用场景?

在新能源汽车行业迅猛发展的今天,智慧充电桩作为支持这一变革的关键基础设施,正在多个实际应用场景中发挥着重要作用。从公共停车场到高速公路服务区,从企业园区到住宅小区,智慧充电桩不仅提供了便捷的充电服务,还通过…

MCU驱动使用

一、时钟的配置: AG32 通常使用 HSE 外部晶体(范围:4M~16M)。 AG32 中不需要手动设置 PLL 时钟(时钟树由系统自动配置,无须用户关注)。用户只需在配置文件中给出外部晶振频率和系统主频即可。 …

简单的bytebuddy学习笔记

简单的bytebuddy学习笔记 此笔记对应b站bytebuddy学习视频进行整理,此为视频地址,此处为具体的练习代码地址 一、简介 ByteBuddy是基于ASM (ow2.io)实现的字节码操作类库。比起ASM,ByteBuddy的API更加简单易用。开发者无需了解class file …

2025erp系统开源免费进销存系统搭建教程/功能介绍/上线即可运营软件平台源码

系统介绍 基于ThinkPHP与LayUI构建的全方位进销存解决方案 本系统集成了采购、销售、零售、多仓库管理、财务管理等核心功能模块,旨在为企业提供一站式进销存管理体验。借助详尽的报表分析和灵活的设置选项,企业可实现精细化管理,提升运营效…