Compare commits
2 Commits
7585b8e9da
...
6323b49517
| Author | SHA1 | Date | |
|---|---|---|---|
| 6323b49517 | |||
| 4fe98f2815 |
47
README.md
47
README.md
@@ -50,12 +50,20 @@ go env GOPRIVATE
|
|||||||
|
|
||||||
**详细配置说明请参考 [SETUP.md](./SETUP.md)**
|
**详细配置说明请参考 [SETUP.md](./SETUP.md)**
|
||||||
|
|
||||||
|
**遇到问题?请查看 [故障排除指南](./TROUBLESHOOTING.md)**
|
||||||
|
|
||||||
### 2. 安装模块
|
### 2. 安装模块
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
go get git.toowon.com/jimmy/go-common
|
# 安装最新版本(推荐用于开发)
|
||||||
|
go get git.toowon.com/jimmy/go-common@latest
|
||||||
|
|
||||||
|
# 安装特定版本(推荐用于生产)
|
||||||
|
go get git.toowon.com/jimmy/go-common@v1.0.0
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**版本管理说明请参考 [VERSION.md](./VERSION.md)**
|
||||||
|
|
||||||
## 使用示例
|
## 使用示例
|
||||||
|
|
||||||
详细的使用说明请参考各模块的文档:
|
详细的使用说明请参考各模块的文档:
|
||||||
@@ -194,14 +202,9 @@ fac, _ := factory.NewFactoryFromFile("./config.json")
|
|||||||
db, _ := fac.GetDatabase()
|
db, _ := fac.GetDatabase()
|
||||||
db.Find(&users) // 直接使用,无需再创建连接
|
db.Find(&users) // 直接使用,无需再创建连接
|
||||||
|
|
||||||
// 获取Redis配置(用于创建Redis客户端)
|
// 直接获取Redis客户端(已初始化,可直接使用)
|
||||||
redisConfig := fac.GetRedisConfig()
|
redisClient, _ := fac.GetRedisClient()
|
||||||
// 使用go-redis创建客户端:
|
val, _ := redisClient.Get(ctx, "key").Result()
|
||||||
// rdb := redis.NewClient(&redis.Options{
|
|
||||||
// Addr: fmt.Sprintf("%s:%d", redisConfig.Host, redisConfig.Port),
|
|
||||||
// Password: redisConfig.Password,
|
|
||||||
// DB: redisConfig.Database,
|
|
||||||
// })
|
|
||||||
|
|
||||||
// 直接获取已初始化的客户端(无需重复实现创建逻辑)
|
// 直接获取已初始化的客户端(无需重复实现创建逻辑)
|
||||||
emailClient, _ := fac.GetEmailClient()
|
emailClient, _ := fac.GetEmailClient()
|
||||||
@@ -216,7 +219,29 @@ logger.Info("Application started")
|
|||||||
|
|
||||||
更多示例请查看 [examples](./examples/) 目录。
|
更多示例请查看 [examples](./examples/) 目录。
|
||||||
|
|
||||||
## 版本
|
## 版本管理
|
||||||
|
|
||||||
v1.0.0
|
当前版本:**v1.0.0**
|
||||||
|
|
||||||
|
### 如何指定版本
|
||||||
|
|
||||||
|
在 `go.mod` 文件中指定版本:
|
||||||
|
|
||||||
|
```go
|
||||||
|
require (
|
||||||
|
git.toowon.com/jimmy/go-common v1.0.0
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
或者使用命令行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 使用最新版本
|
||||||
|
go get git.toowon.com/jimmy/go-common@latest
|
||||||
|
|
||||||
|
# 使用特定版本
|
||||||
|
go get git.toowon.com/jimmy/go-common@v1.0.0
|
||||||
|
```
|
||||||
|
|
||||||
|
**详细版本管理说明请参考 [VERSION.md](./VERSION.md)**
|
||||||
|
|
||||||
|
|||||||
208
TROUBLESHOOTING.md
Normal file
208
TROUBLESHOOTING.md
Normal file
@@ -0,0 +1,208 @@
|
|||||||
|
# 故障排除指南
|
||||||
|
|
||||||
|
## 常见问题
|
||||||
|
|
||||||
|
### 1. 伪版本错误 (Pseudo-version error)
|
||||||
|
|
||||||
|
**错误信息:**
|
||||||
|
```
|
||||||
|
go: github.com/pmezard/go-difflib@v1.1.1-0.20181226105442-5d4384ee4fb2: invalid pseudo-version: preceding tag (v1.1.0) not found
|
||||||
|
```
|
||||||
|
|
||||||
|
**原因:**
|
||||||
|
- Go 模块缓存损坏
|
||||||
|
- 依赖版本冲突
|
||||||
|
- 间接依赖使用了无效的伪版本
|
||||||
|
|
||||||
|
**解决方案:**
|
||||||
|
|
||||||
|
#### 方案1:清理模块缓存(推荐)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 清理 Go 模块缓存
|
||||||
|
go clean -modcache
|
||||||
|
|
||||||
|
# 重新下载依赖
|
||||||
|
go mod download
|
||||||
|
|
||||||
|
# 整理依赖
|
||||||
|
go mod tidy
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 方案2:在调用方项目中解决
|
||||||
|
|
||||||
|
如果是在调用方项目中遇到此问题:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 进入调用方项目目录
|
||||||
|
cd /path/to/your/project
|
||||||
|
|
||||||
|
# 清理模块缓存
|
||||||
|
go clean -modcache
|
||||||
|
|
||||||
|
# 删除 go.sum 文件(可选,会自动重新生成)
|
||||||
|
rm go.sum
|
||||||
|
|
||||||
|
# 重新获取依赖
|
||||||
|
go get git.toowon.com/jimmy/go-common@v0.0.1
|
||||||
|
|
||||||
|
# 整理依赖
|
||||||
|
go mod tidy
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 方案3:使用代理(如果网络问题)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 设置 Go 代理(国内用户推荐)
|
||||||
|
go env -w GOPROXY=https://goproxy.cn,direct
|
||||||
|
|
||||||
|
# 或者使用官方代理
|
||||||
|
go env -w GOPROXY=https://proxy.golang.org,direct
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 方案4:强制更新依赖
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 强制更新所有依赖
|
||||||
|
go get -u ./...
|
||||||
|
|
||||||
|
# 或者更新特定依赖
|
||||||
|
go get -u git.toowon.com/jimmy/go-common@latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 私有仓库访问问题
|
||||||
|
|
||||||
|
**错误信息:**
|
||||||
|
```
|
||||||
|
go: git.toowon.com/jimmy/go-common@v0.0.1: unrecognized import path
|
||||||
|
```
|
||||||
|
|
||||||
|
**解决方案:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 配置 GOPRIVATE
|
||||||
|
go env -w GOPRIVATE=git.toowon.com
|
||||||
|
|
||||||
|
# 配置 Git 认证(如果需要)
|
||||||
|
git config --global url."git@git.toowon.com:".insteadOf "https://git.toowon.com/"
|
||||||
|
```
|
||||||
|
|
||||||
|
详细说明请参考 [SETUP.md](./SETUP.md)
|
||||||
|
|
||||||
|
### 3. 版本标签不存在
|
||||||
|
|
||||||
|
**错误信息:**
|
||||||
|
```
|
||||||
|
go: git.toowon.com/jimmy/go-common@v0.0.1: invalid version: unknown revision
|
||||||
|
```
|
||||||
|
|
||||||
|
**解决方案:**
|
||||||
|
|
||||||
|
1. 确认版本标签已创建并推送:
|
||||||
|
```bash
|
||||||
|
# 在库项目中查看标签
|
||||||
|
git tag -l
|
||||||
|
|
||||||
|
# 如果标签不存在,创建并推送
|
||||||
|
git tag -a v0.0.1 -m "Release v0.0.1"
|
||||||
|
git push origin v0.0.1
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 在调用方项目中清理缓存后重试:
|
||||||
|
```bash
|
||||||
|
go clean -modcache
|
||||||
|
go get git.toowon.com/jimmy/go-common@v0.0.1
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. 依赖版本冲突
|
||||||
|
|
||||||
|
**错误信息:**
|
||||||
|
```
|
||||||
|
go: conflicting versions for module
|
||||||
|
```
|
||||||
|
|
||||||
|
**解决方案:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看依赖树
|
||||||
|
go mod graph | grep conflicting-module
|
||||||
|
|
||||||
|
# 更新冲突的依赖
|
||||||
|
go get -u conflicting-module@latest
|
||||||
|
|
||||||
|
# 整理依赖
|
||||||
|
go mod tidy
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. 网络连接问题
|
||||||
|
|
||||||
|
**错误信息:**
|
||||||
|
```
|
||||||
|
dial tcp: lookup proxy.golang.org: no such host
|
||||||
|
```
|
||||||
|
|
||||||
|
**解决方案:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 使用国内代理
|
||||||
|
go env -w GOPROXY=https://goproxy.cn,direct
|
||||||
|
|
||||||
|
# 或者使用七牛云代理
|
||||||
|
go env -w GOPROXY=https://goproxy.io,direct
|
||||||
|
|
||||||
|
# 禁用代理(直接访问)
|
||||||
|
go env -w GOPROXY=direct
|
||||||
|
```
|
||||||
|
|
||||||
|
## 通用排查步骤
|
||||||
|
|
||||||
|
如果遇到其他问题,按以下步骤排查:
|
||||||
|
|
||||||
|
1. **清理缓存**
|
||||||
|
```bash
|
||||||
|
go clean -modcache
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **验证模块**
|
||||||
|
```bash
|
||||||
|
go mod verify
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **整理依赖**
|
||||||
|
```bash
|
||||||
|
go mod tidy
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **查看依赖图**
|
||||||
|
```bash
|
||||||
|
go mod graph
|
||||||
|
```
|
||||||
|
|
||||||
|
5. **查看模块信息**
|
||||||
|
```bash
|
||||||
|
go list -m all
|
||||||
|
```
|
||||||
|
|
||||||
|
6. **检查 Go 环境**
|
||||||
|
```bash
|
||||||
|
go env
|
||||||
|
```
|
||||||
|
|
||||||
|
## 获取帮助
|
||||||
|
|
||||||
|
如果以上方法都无法解决问题,请:
|
||||||
|
|
||||||
|
1. 检查 Go 版本(建议使用 Go 1.21 或更高版本)
|
||||||
|
```bash
|
||||||
|
go version
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 查看详细的错误信息
|
||||||
|
```bash
|
||||||
|
go get -v git.toowon.com/jimmy/go-common@v0.0.1
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 检查项目仓库是否有对应的版本标签
|
||||||
|
|
||||||
|
4. 联系项目维护者
|
||||||
|
|
||||||
131
VERSION.md
Normal file
131
VERSION.md
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
# 版本管理说明
|
||||||
|
|
||||||
|
## 版本号规则
|
||||||
|
|
||||||
|
本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/) 规范:
|
||||||
|
|
||||||
|
- **主版本号(MAJOR)**:当你做了不兼容的 API 修改
|
||||||
|
- **次版本号(MINOR)**:当你做了向下兼容的功能性新增
|
||||||
|
- **修订号(PATCH)**:当你做了向下兼容的问题修正
|
||||||
|
|
||||||
|
版本格式:`v主版本号.次版本号.修订号`,例如:`v1.0.0`、`v1.1.0`、`v2.0.0`
|
||||||
|
|
||||||
|
## 发布新版本
|
||||||
|
|
||||||
|
### 方式1:使用发布脚本(推荐)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 使用发布脚本(会自动验证版本格式、检查未提交更改等)
|
||||||
|
./scripts/release.sh v1.0.0 "Release version 1.0.0"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方式2:手动创建标签
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 确保所有更改已提交
|
||||||
|
git add .
|
||||||
|
git commit -m "Prepare for release v1.0.0"
|
||||||
|
|
||||||
|
# 2. 创建版本标签
|
||||||
|
git tag -a v1.0.0 -m "Release version 1.0.0"
|
||||||
|
|
||||||
|
# 3. 推送标签到远程仓库
|
||||||
|
git push origin v1.0.0
|
||||||
|
|
||||||
|
# 或者一次性推送所有标签
|
||||||
|
git push origin --tags
|
||||||
|
```
|
||||||
|
|
||||||
|
### 验证标签
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看所有标签
|
||||||
|
git tag -l
|
||||||
|
|
||||||
|
# 查看标签详情
|
||||||
|
git show v1.0.0
|
||||||
|
|
||||||
|
# 查看标签列表(带注释)
|
||||||
|
git tag -l -n
|
||||||
|
```
|
||||||
|
|
||||||
|
## 调用方如何使用版本
|
||||||
|
|
||||||
|
### 方式1:使用最新版本(推荐用于开发)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
go get git.toowon.com/jimmy/go-common@latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方式2:使用特定版本(推荐用于生产)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 使用具体版本号
|
||||||
|
go get git.toowon.com/jimmy/go-common@v1.0.0
|
||||||
|
|
||||||
|
# 使用版本范围(自动选择最新版本)
|
||||||
|
go get git.toowon.com/jimmy/go-common@v1.0
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方式3:在 go.mod 中指定版本
|
||||||
|
|
||||||
|
```go
|
||||||
|
module your-project
|
||||||
|
|
||||||
|
require (
|
||||||
|
git.toowon.com/jimmy/go-common v1.0.0
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
然后运行:
|
||||||
|
```bash
|
||||||
|
go mod tidy
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方式4:更新到最新版本
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 更新到最新版本
|
||||||
|
go get -u git.toowon.com/jimmy/go-common@latest
|
||||||
|
|
||||||
|
# 更新到最新补丁版本(如从 v1.0.0 更新到 v1.0.1)
|
||||||
|
go get -u=patch git.toowon.com/jimmy/go-common
|
||||||
|
|
||||||
|
# 更新到最新次版本(如从 v1.0.0 更新到 v1.1.0)
|
||||||
|
go get -u=minor git.toowon.com/jimmy/go-common
|
||||||
|
```
|
||||||
|
|
||||||
|
## 版本发布流程
|
||||||
|
|
||||||
|
1. **开发完成**:确保所有功能已实现并通过测试
|
||||||
|
2. **更新版本号**:在 `README.md` 和 `VERSION.md` 中更新版本号
|
||||||
|
3. **提交代码**:提交所有更改到 Git
|
||||||
|
```bash
|
||||||
|
git add .
|
||||||
|
git commit -m "Prepare for release v1.0.0"
|
||||||
|
```
|
||||||
|
4. **创建并推送标签**:
|
||||||
|
```bash
|
||||||
|
# 使用脚本(推荐)
|
||||||
|
./scripts/release.sh v1.0.0 "Release version 1.0.0"
|
||||||
|
|
||||||
|
# 或手动创建
|
||||||
|
git tag -a v1.0.0 -m "Release version 1.0.0"
|
||||||
|
git push origin v1.0.0
|
||||||
|
```
|
||||||
|
5. **验证**:在其他项目中测试是否能正确获取该版本
|
||||||
|
```bash
|
||||||
|
# 在新项目中测试
|
||||||
|
go get git.toowon.com/jimmy/go-common@v1.0.0
|
||||||
|
```
|
||||||
|
|
||||||
|
## 当前版本
|
||||||
|
|
||||||
|
当前版本:**v1.0.0**
|
||||||
|
|
||||||
|
## 版本历史
|
||||||
|
|
||||||
|
- **v1.0.0** (当前版本)
|
||||||
|
- 初始版本
|
||||||
|
- 包含所有基础工具类:migration、datetime、http、middleware、config、storage、email、sms、factory、logger
|
||||||
|
|
||||||
@@ -62,19 +62,29 @@ db.Find(&users)
|
|||||||
db.Create(&user)
|
db.Create(&user)
|
||||||
```
|
```
|
||||||
|
|
||||||
### 4. 获取Redis配置
|
### 4. 获取Redis客户端(已初始化,推荐)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
// 获取Redis配置(用于创建Redis客户端)
|
import (
|
||||||
// 注意:Go标准库没有Redis客户端,需要调用方使用第三方库创建
|
"context"
|
||||||
redisConfig := fac.GetRedisConfig()
|
"github.com/redis/go-redis/v9"
|
||||||
if redisConfig != nil {
|
)
|
||||||
// 使用go-redis创建客户端示例:
|
|
||||||
// rdb := redis.NewClient(&redis.Options{
|
// 直接获取已初始化的Redis客户端对象
|
||||||
// Addr: fmt.Sprintf("%s:%d", redisConfig.Host, redisConfig.Port),
|
redisClient, err := fac.GetRedisClient()
|
||||||
// Password: redisConfig.Password,
|
if err != nil {
|
||||||
// DB: redisConfig.Database,
|
log.Fatal(err)
|
||||||
// })
|
}
|
||||||
|
|
||||||
|
// 直接使用,无需再创建连接
|
||||||
|
ctx := context.Background()
|
||||||
|
val, err := redisClient.Get(ctx, "key").Result()
|
||||||
|
if err != nil && err != redis.Nil {
|
||||||
|
log.Printf("Redis error: %v", err)
|
||||||
|
} else if err == redis.Nil {
|
||||||
|
fmt.Println("Key not found")
|
||||||
|
} else {
|
||||||
|
fmt.Printf("Value: %s\n", val)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -244,6 +254,18 @@ func main() {
|
|||||||
- 自动配置连接池参数
|
- 自动配置连接池参数
|
||||||
- 数据库时间统一使用UTC时区
|
- 数据库时间统一使用UTC时区
|
||||||
|
|
||||||
|
### (f *Factory) GetRedisClient() (*redis.Client, error)
|
||||||
|
|
||||||
|
获取Redis客户端对象(已初始化)。
|
||||||
|
|
||||||
|
**返回:** 已初始化的Redis客户端对象和错误信息
|
||||||
|
|
||||||
|
**说明:**
|
||||||
|
- 自动处理所有配置检查和连接测试
|
||||||
|
- 自动设置默认值(连接池大小、超时时间等)
|
||||||
|
- 连接失败时会自动关闭客户端并返回错误
|
||||||
|
- 返回的客户端已通过Ping测试,可直接使用
|
||||||
|
|
||||||
### (f *Factory) GetRedisConfig() *config.RedisConfig
|
### (f *Factory) GetRedisConfig() *config.RedisConfig
|
||||||
|
|
||||||
获取Redis配置(用于创建Redis客户端)。
|
获取Redis配置(用于创建Redis客户端)。
|
||||||
@@ -251,8 +273,8 @@ func main() {
|
|||||||
**返回:** Redis配置对象(可能为nil)
|
**返回:** Redis配置对象(可能为nil)
|
||||||
|
|
||||||
**说明:**
|
**说明:**
|
||||||
- Go标准库没有Redis客户端,需要调用方使用第三方库(如go-redis/redis)创建
|
- 推荐使用 `GetRedisClient()` 方法直接获取已初始化的客户端
|
||||||
- 返回配置对象,调用方可以根据配置创建Redis客户端
|
- 如果需要自定义创建Redis客户端,可以使用此方法获取配置
|
||||||
|
|
||||||
### (f *Factory) GetConfig() *config.Config
|
### (f *Factory) GetConfig() *config.Config
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-common/factory"
|
"git.toowon.com/jimmy/go-common/factory"
|
||||||
|
"github.com/redis/go-redis/v9"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -28,17 +30,21 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取Redis配置(用于创建Redis客户端)
|
// 直接获取Redis客户端(已初始化,可直接使用)
|
||||||
redisConfig := fac.GetRedisConfig()
|
redisClient, err := fac.GetRedisClient()
|
||||||
if redisConfig != nil {
|
if err != nil {
|
||||||
fmt.Printf("Redis config: %s:%d\n", redisConfig.Host, redisConfig.Port)
|
log.Printf("Redis not available: %v", err)
|
||||||
// 使用go-redis创建客户端示例:
|
} else {
|
||||||
// import "github.com/redis/go-redis/v9"
|
// 直接使用Redis客户端
|
||||||
// rdb := redis.NewClient(&redis.Options{
|
ctx := context.Background()
|
||||||
// Addr: fmt.Sprintf("%s:%d", redisConfig.Host, redisConfig.Port),
|
val, err := redisClient.Get(ctx, "test_key").Result()
|
||||||
// Password: redisConfig.Password,
|
if err != nil && err != redis.Nil {
|
||||||
// DB: redisConfig.Database,
|
log.Printf("Redis error: %v", err)
|
||||||
// })
|
} else if err == redis.Nil {
|
||||||
|
fmt.Println("Redis key not found")
|
||||||
|
} else {
|
||||||
|
fmt.Printf("Redis value: %s\n", val)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取邮件客户端(已初始化,可直接使用)
|
// 获取邮件客户端(已初始化,可直接使用)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package factory
|
package factory
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -8,6 +9,7 @@ import (
|
|||||||
"git.toowon.com/jimmy/go-common/email"
|
"git.toowon.com/jimmy/go-common/email"
|
||||||
"git.toowon.com/jimmy/go-common/logger"
|
"git.toowon.com/jimmy/go-common/logger"
|
||||||
"git.toowon.com/jimmy/go-common/sms"
|
"git.toowon.com/jimmy/go-common/sms"
|
||||||
|
"github.com/redis/go-redis/v9"
|
||||||
"gorm.io/driver/mysql"
|
"gorm.io/driver/mysql"
|
||||||
"gorm.io/driver/postgres"
|
"gorm.io/driver/postgres"
|
||||||
"gorm.io/driver/sqlite"
|
"gorm.io/driver/sqlite"
|
||||||
@@ -113,9 +115,66 @@ func (f *Factory) GetDatabase() (*gorm.DB, error) {
|
|||||||
return db, nil
|
return db, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetRedisClient 获取Redis客户端对象(已初始化)
|
||||||
|
// 返回已初始化的Redis客户端对象,可直接使用
|
||||||
|
func (f *Factory) GetRedisClient() (*redis.Client, error) {
|
||||||
|
if f.cfg.Redis == nil {
|
||||||
|
return nil, fmt.Errorf("redis config is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取Redis地址
|
||||||
|
addr := f.cfg.GetRedisAddr()
|
||||||
|
if addr == "" {
|
||||||
|
return nil, fmt.Errorf("redis address is empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置默认值
|
||||||
|
redisConfig := f.cfg.Redis
|
||||||
|
if redisConfig.PoolSize == 0 {
|
||||||
|
redisConfig.PoolSize = 10 // 默认连接池大小
|
||||||
|
}
|
||||||
|
if redisConfig.MinIdleConns == 0 {
|
||||||
|
redisConfig.MinIdleConns = 5 // 默认最小空闲连接数
|
||||||
|
}
|
||||||
|
if redisConfig.DialTimeout == 0 {
|
||||||
|
redisConfig.DialTimeout = 5 // 默认连接超时5秒
|
||||||
|
}
|
||||||
|
if redisConfig.ReadTimeout == 0 {
|
||||||
|
redisConfig.ReadTimeout = 3 // 默认读取超时3秒
|
||||||
|
}
|
||||||
|
if redisConfig.WriteTimeout == 0 {
|
||||||
|
redisConfig.WriteTimeout = 3 // 默认写入超时3秒
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建Redis客户端
|
||||||
|
client := redis.NewClient(&redis.Options{
|
||||||
|
Addr: addr,
|
||||||
|
Password: redisConfig.Password,
|
||||||
|
DB: redisConfig.Database,
|
||||||
|
PoolSize: redisConfig.PoolSize,
|
||||||
|
MinIdleConns: redisConfig.MinIdleConns,
|
||||||
|
MaxRetries: redisConfig.MaxRetries,
|
||||||
|
DialTimeout: time.Duration(redisConfig.DialTimeout) * time.Second,
|
||||||
|
ReadTimeout: time.Duration(redisConfig.ReadTimeout) * time.Second,
|
||||||
|
WriteTimeout: time.Duration(redisConfig.WriteTimeout) * time.Second,
|
||||||
|
})
|
||||||
|
|
||||||
|
// 测试连接
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(redisConfig.DialTimeout)*time.Second)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
_, err := client.Ping(ctx).Result()
|
||||||
|
if err != nil {
|
||||||
|
client.Close() // 连接失败时关闭客户端
|
||||||
|
return nil, fmt.Errorf("failed to connect to redis: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return client, nil
|
||||||
|
}
|
||||||
|
|
||||||
// GetRedisConfig 获取Redis配置(用于创建Redis客户端)
|
// GetRedisConfig 获取Redis配置(用于创建Redis客户端)
|
||||||
// 返回Redis配置对象,调用方可以使用此配置创建Redis客户端
|
// 返回Redis配置对象,调用方可以使用此配置创建Redis客户端
|
||||||
// 注意:Go标准库没有Redis客户端,需要调用方使用第三方库(如go-redis/redis)创建
|
// 注意:推荐使用 GetRedisClient 方法直接获取已初始化的客户端
|
||||||
func (f *Factory) GetRedisConfig() *config.RedisConfig {
|
func (f *Factory) GetRedisConfig() *config.RedisConfig {
|
||||||
return f.cfg.Redis
|
return f.cfg.Redis
|
||||||
}
|
}
|
||||||
|
|||||||
5
go.mod
5
go.mod
@@ -4,11 +4,14 @@ go 1.21
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
gorm.io/driver/mysql v1.5.2
|
gorm.io/driver/mysql v1.5.2
|
||||||
|
gorm.io/driver/postgres v1.6.0
|
||||||
gorm.io/driver/sqlite v1.6.0
|
gorm.io/driver/sqlite v1.6.0
|
||||||
gorm.io/gorm v1.30.0
|
gorm.io/gorm v1.30.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||||
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
||||||
github.com/go-sql-driver/mysql v1.7.1 // indirect
|
github.com/go-sql-driver/mysql v1.7.1 // indirect
|
||||||
github.com/jackc/pgpassfile v1.0.0 // indirect
|
github.com/jackc/pgpassfile v1.0.0 // indirect
|
||||||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
|
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
|
||||||
@@ -17,8 +20,8 @@ require (
|
|||||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||||
github.com/jinzhu/now v1.1.5 // indirect
|
github.com/jinzhu/now v1.1.5 // indirect
|
||||||
github.com/mattn/go-sqlite3 v1.14.22 // indirect
|
github.com/mattn/go-sqlite3 v1.14.22 // indirect
|
||||||
|
github.com/redis/go-redis/v9 v9.17.1 // indirect
|
||||||
golang.org/x/crypto v0.31.0 // indirect
|
golang.org/x/crypto v0.31.0 // indirect
|
||||||
golang.org/x/sync v0.10.0 // indirect
|
golang.org/x/sync v0.10.0 // indirect
|
||||||
golang.org/x/text v0.21.0 // indirect
|
golang.org/x/text v0.21.0 // indirect
|
||||||
gorm.io/driver/postgres v1.6.0 // indirect
|
|
||||||
)
|
)
|
||||||
|
|||||||
15
go.sum
15
go.sum
@@ -1,4 +1,10 @@
|
|||||||
|
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||||
|
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
|
||||||
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
|
||||||
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
|
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
|
||||||
github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
|
github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
|
||||||
github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
|
github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
|
||||||
@@ -16,20 +22,25 @@ github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
|
|||||||
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
|
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
|
||||||
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
|
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
|
||||||
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/redis/go-redis/v9 v9.17.1 h1:7tl732FjYPRT9H9aNfyTwKg9iTETjWjGKEJ2t/5iWTs=
|
||||||
|
github.com/redis/go-redis/v9 v9.17.1/go.mod h1:u410H11HMLoB+TP67dz8rL9s6QW2j76l0//kSOd3370=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
||||||
|
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||||
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
|
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
|
||||||
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
|
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
|
||||||
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
|
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
|
||||||
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
|
|
||||||
golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
|
|
||||||
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
|
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
|
||||||
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
|
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=
|
gorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=
|
||||||
gorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=
|
gorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=
|
||||||
gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4=
|
gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4=
|
||||||
|
|||||||
66
scripts/release.sh
Executable file
66
scripts/release.sh
Executable file
@@ -0,0 +1,66 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 版本发布脚本
|
||||||
|
# 使用方法: ./scripts/release.sh v1.0.0 "Release message"
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
VERSION=$1
|
||||||
|
MESSAGE=$2
|
||||||
|
|
||||||
|
if [ -z "$VERSION" ]; then
|
||||||
|
echo "错误: 请提供版本号"
|
||||||
|
echo "使用方法: ./scripts/release.sh v1.0.0 \"Release message\""
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$MESSAGE" ]; then
|
||||||
|
MESSAGE="Release $VERSION"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 验证版本号格式 (v主版本号.次版本号.修订号)
|
||||||
|
if ! [[ $VERSION =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||||
|
echo "错误: 版本号格式不正确,应为 v主版本号.次版本号.修订号 (例如: v1.0.0)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "准备发布版本: $VERSION"
|
||||||
|
echo "发布信息: $MESSAGE"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 检查是否有未提交的更改
|
||||||
|
if [ -n "$(git status --porcelain)" ]; then
|
||||||
|
echo "警告: 检测到未提交的更改"
|
||||||
|
read -p "是否继续? (y/n) " -n 1 -r
|
||||||
|
echo
|
||||||
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检查标签是否已存在
|
||||||
|
if git rev-parse "$VERSION" >/dev/null 2>&1; then
|
||||||
|
echo "错误: 版本标签 $VERSION 已存在"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 创建标签
|
||||||
|
echo "创建版本标签..."
|
||||||
|
git tag -a "$VERSION" -m "$MESSAGE"
|
||||||
|
|
||||||
|
# 询问是否推送
|
||||||
|
read -p "是否推送到远程仓库? (y/n) " -n 1 -r
|
||||||
|
echo
|
||||||
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
echo "推送标签到远程仓库..."
|
||||||
|
git push origin "$VERSION"
|
||||||
|
echo "版本 $VERSION 已成功发布!"
|
||||||
|
else
|
||||||
|
echo "标签已创建,但未推送。使用以下命令推送:"
|
||||||
|
echo " git push origin $VERSION"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "完成! 调用方现在可以使用以下命令安装此版本:"
|
||||||
|
echo " go get git.toowon.com/jimmy/go-common@$VERSION"
|
||||||
|
|
||||||
Reference in New Issue
Block a user