update-version.sh 2.88 KB
#!/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 ""