update-version.sh
2.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#!/bin/bash
###############################################################################
# 版本自动更新脚本(内联版本)
#
# 功能:根据 commit message 类型自动更新 package.json 版本号
# 规则:遵循 Semantic Versioning
# - feat: MINOR (1.x.x → 1.y.0)
# - fix: PATCH (x.y.z → x.y.(z+1))
# - perf: MINOR
# - 其他: 不更新
#
# 使用方式:commit-msg hook 中通过 source 调用此脚本
###############################################################################
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# 获取 commit message(从环境变量获取,由 husky 传递)
COMMIT_MSG="${HUSKY_COMMIT_MSG}"
# 提取 type(feat|fix|perf)
if [[ $COMMIT_MSG =~ ^feat[[:/\(]] ]]; then
TYPE="feat"
elif [[ $COMMIT_MSG =~ ^fix[[:/\] ]]; then
TYPE="fix"
elif [[ $COMMIT_MSG =~ ^perf[[:/\] ]]; then
TYPE="perf"
else
echo "${YELLOW}ℹ️ $TYPE 类型不触发版本更新${NC}"
exit 0
fi
echo "📋 Type: ${TYPE:-none}"
# 读取当前版本
CURRENT=$(node -p "require('./package.json').version")
echo "📌 当前版本: ${CURRENT}"
echo ""
# 解析版本号 (MAJOR.MINOR.PATCH)
IFS='.' read -r -a <<< "$CURRENT"
MAJOR=${VERSION_ARRAY[0]}
MINOR=${VERSION_ARRAY[1]}
PATCH=${VERSION_ARRAY[2]}
# 版本更新逻辑
case $TYPE in
feat|perf)
# MINOR 版本更新:1.0.0 → 1.1.0
MINOR=$((MINOR + 1))
PATCH=0
;;
fix)
# PATCH 版本更新:1.0.0 → 1.0.1
PATCH=$((PATCH + 1))
;;
esac
echo "${YELLOW}ℹ️ $TYPE 类型不触发版本更新${NC}"
exit 0
;;
esac
echo "${YELLOW}ℹ️ revert 类型不触发版本更新${NC}"
exit 0
;;
esac
echo "${YELLOW}ℹ️ chore 类型不触发版本更新${NC}"
exit 0
;;
esac
echo "${YELLOW}ℹ️ style 类型不触发版本更新${NC}"
exit 0
;;
esac
echo "${YELLOW}ℹ️ test 类型不触发版本更新${NC}"
exit 0
;;
esac
echo "${YELLOW}ℹ️ docs 类型不触发版本更新${NC}"
exit 0
;;
esac
echo "${YELLOW}ℹ️ refactor 类型不触发版本更新${NC}"
exit 0
;;
esac
echo "${YELLOW}ℹ️ build 类型不触发版本更新${NC}"
exit 0
;;
esac
echo "${YELLOW}ℹ️ ci 类型不触发版本更新${NC}"
exit 0
;;
esac
echo "${YELLOW}ℹ️ revert 类型不触发版本更新${NC}"
exit 0
;;
esac
echo "${YELLOW}ℹ️ unknown 类型不触发版本更新${NC}"
exit 0
;;
esac
echo "${RED}❌ 无法识别的 commit type${NC}"
exit 1
;;
esac
# 计算新版本
NEW="${MAJOR}.${MINOR}.${PATCH}"
# 更新 package.json
npm version --no-git-tag-version "$NEW" >/dev/null 2>&1
# 检查版本是否真的变化了
if [ "$NEW" = "$CURRENT" ]; then
echo "${YELLOW}⚠️ 版本未变化,跳过更新${NC}"
exit 0
fi
echo ""
echo "${GREEN}✅ 版本已更新: ${CURRENT} → ${NEW}${NC}"
echo ""