2 Commits

Author SHA1 Message Date
6323b49517 增加Redis的调整,直接返回redis对象 2025-11-30 14:53:54 +08:00
4fe98f2815 增加发版本的功能 2025-11-30 14:04:33 +08:00
9 changed files with 570 additions and 39 deletions

View File

@@ -50,12 +50,20 @@ go env GOPRIVATE
**详细配置说明请参考 [SETUP.md](./SETUP.md)**
**遇到问题?请查看 [故障排除指南](./TROUBLESHOOTING.md)**
### 2. 安装模块
```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.Find(&users) // 直接使用,无需再创建连接
// 获取Redis配置用于创建Redis客户端)
redisConfig := fac.GetRedisConfig()
// 使用go-redis创建客户端
// rdb := redis.NewClient(&redis.Options{
// Addr: fmt.Sprintf("%s:%d", redisConfig.Host, redisConfig.Port),
// Password: redisConfig.Password,
// DB: redisConfig.Database,
// })
// 直接获取Redis客户端(已初始化,可直接使用
redisClient, _ := fac.GetRedisClient()
val, _ := redisClient.Get(ctx, "key").Result()
// 直接获取已初始化的客户端(无需重复实现创建逻辑)
emailClient, _ := fac.GetEmailClient()
@@ -216,7 +219,29 @@ logger.Info("Application started")
更多示例请查看 [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
View 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
View 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

View File

@@ -62,19 +62,29 @@ db.Find(&users)
db.Create(&user)
```
### 4. 获取Redis配置
### 4. 获取Redis客户端(已初始化,推荐)
```go
// 获取Redis配置用于创建Redis客户端
// 注意Go标准库没有Redis客户端需要调用方使用第三方库创建
redisConfig := fac.GetRedisConfig()
if redisConfig != nil {
// 使用go-redis创建客户端示例
// rdb := redis.NewClient(&redis.Options{
// Addr: fmt.Sprintf("%s:%d", redisConfig.Host, redisConfig.Port),
// Password: redisConfig.Password,
// DB: redisConfig.Database,
// })
import (
"context"
"github.com/redis/go-redis/v9"
)
// 直接获取已初始化的Redis客户端对象
redisClient, err := fac.GetRedisClient()
if err != nil {
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时区
### (f *Factory) GetRedisClient() (*redis.Client, error)
获取Redis客户端对象已初始化
**返回:** 已初始化的Redis客户端对象和错误信息
**说明:**
- 自动处理所有配置检查和连接测试
- 自动设置默认值(连接池大小、超时时间等)
- 连接失败时会自动关闭客户端并返回错误
- 返回的客户端已通过Ping测试可直接使用
### (f *Factory) GetRedisConfig() *config.RedisConfig
获取Redis配置用于创建Redis客户端
@@ -251,8 +273,8 @@ func main() {
**返回:** Redis配置对象可能为nil
**说明:**
- Go标准库没有Redis客户端需要调用方使用第三方库如go-redis/redis创建
- 返回配置对象调用方可以根据配置创建Redis客户端
- 推荐使用 `GetRedisClient()` 方法直接获取已初始化的客户端
- 如果需要自定义创建Redis客户端可以使用此方法获取配置
### (f *Factory) GetConfig() *config.Config

View File

@@ -1,10 +1,12 @@
package main
import (
"context"
"fmt"
"log"
"git.toowon.com/jimmy/go-common/factory"
"github.com/redis/go-redis/v9"
)
func main() {
@@ -28,17 +30,21 @@ func main() {
}
}
// 获取Redis配置用于创建Redis客户端)
redisConfig := fac.GetRedisConfig()
if redisConfig != nil {
fmt.Printf("Redis config: %s:%d\n", redisConfig.Host, redisConfig.Port)
// 使用go-redis创建客户端示例
// import "github.com/redis/go-redis/v9"
// rdb := redis.NewClient(&redis.Options{
// Addr: fmt.Sprintf("%s:%d", redisConfig.Host, redisConfig.Port),
// Password: redisConfig.Password,
// DB: redisConfig.Database,
// })
// 直接获取Redis客户端(已初始化,可直接使用
redisClient, err := fac.GetRedisClient()
if err != nil {
log.Printf("Redis not available: %v", err)
} else {
// 直接使用Redis客户端
ctx := context.Background()
val, err := redisClient.Get(ctx, "test_key").Result()
if err != nil && err != redis.Nil {
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)
}
}
// 获取邮件客户端(已初始化,可直接使用)

View File

@@ -1,6 +1,7 @@
package factory
import (
"context"
"fmt"
"time"
@@ -8,6 +9,7 @@ import (
"git.toowon.com/jimmy/go-common/email"
"git.toowon.com/jimmy/go-common/logger"
"git.toowon.com/jimmy/go-common/sms"
"github.com/redis/go-redis/v9"
"gorm.io/driver/mysql"
"gorm.io/driver/postgres"
"gorm.io/driver/sqlite"
@@ -113,9 +115,66 @@ func (f *Factory) GetDatabase() (*gorm.DB, error) {
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客户端
// 返回Redis配置对象调用方可以使用此配置创建Redis客户端
// 注意:Go标准库没有Redis客户端需要调用方使用第三方库如go-redis/redis创建
// 注意:推荐使用 GetRedisClient 方法直接获取已初始化的客户端
func (f *Factory) GetRedisConfig() *config.RedisConfig {
return f.cfg.Redis
}

5
go.mod
View File

@@ -4,11 +4,14 @@ go 1.21
require (
gorm.io/driver/mysql v1.5.2
gorm.io/driver/postgres v1.6.0
gorm.io/driver/sqlite v1.6.0
gorm.io/gorm v1.30.0
)
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/jackc/pgpassfile v1.0.0 // 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/now v1.1.5 // 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/sync v0.10.0 // indirect
golang.org/x/text v0.21.0 // indirect
gorm.io/driver/postgres v1.6.0 // indirect
)

15
go.sum
View File

@@ -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.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.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
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/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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
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/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.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/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
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/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/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
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.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/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8=
gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4=

66
scripts/release.sh Executable file
View 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"