#!/bin/bash # 发布所有子包到私有 npm 仓库 # 使用方法: bash scripts/publish.sh [版本类型] # 版本类型: major | minor | patch (默认 patch) # 注意: 发布仓库地址使用各子包 package.json 中的 publishConfig.registry 配置 set -e # 获取版本类型参数,默认为 patch VERSION_TYPE=${1:-patch} # 验证版本类型 if [[ ! "$VERSION_TYPE" =~ ^(major|minor|patch)$ ]]; then echo "❌ 无效的版本类型: $VERSION_TYPE" echo "使用方法: bash scripts/publish.sh [major|minor|patch]" exit 1 fi echo "🚀 开始发布流程 (版本类型: $VERSION_TYPE)" echo "" # 子包列表 PACKAGES=( "packages/common" "packages/vue3" "packages/uni-app" "packages/vue2" ) # 1. 检查工作区是否干净 echo "🔍 检查 Git 工作区状态..." if [[ -n $(git status -s) ]]; then echo "⚠️ 工作区有未提交的更改,请先提交或暂存" git status -s read -p "是否继续? (y/N) " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then exit 1 fi fi echo "" # 2. 运行测试 echo "🧪 运行测试..." if ! pnpm test; then echo "❌ 测试失败,停止发布" exit 1 fi echo "" # 3. 更新版本号 echo "📝 更新版本号 ($VERSION_TYPE)..." for package in "${PACKAGES[@]}"; do if [ -d "$package" ]; then echo " 更新 $package 版本号..." cd "$package" npm version $VERSION_TYPE --no-git-tag-version cd - > /dev/null fi done echo "" # 4. 构建所有包 echo "📦 构建所有包..." if ! pnpm build; then echo "❌构建失败,停止发布" exit 1 fi echo "" # 5. 更新 README 中的版本信息 echo "📄 更新 README..." COMMON_VERSION=$(node -p "require('./packages/common/package.json').version") echo " 当前版本: $COMMON_VERSION" echo "" # 6. 提交版本更新 echo "💾 提交版本更新..." git add packages/*/package.json git commit -m "chore(release): publish v$COMMON_VERSION" || echo " 没有需要提交的更改" echo "" # 7. 发布每个包 echo "📤 开始发布包到 npm..." for package in "${PACKAGES[@]}"; do if [ -d "$package" ]; then PACKAGE_NAME=$(node -p "require('./$package/package.json').name") PACKAGE_VERSION=$(node -p "require('./$package/package.json').version") echo "📤 发布 $PACKAGE_NAME@$PACKAGE_VERSION ..." cd "$package" if ! pnpm publish --no-git-checks; then echo "❌ $package 发布失败,停止后续发布" exit 1 fi cd - > /dev/null echo "✅ $PACKAGE_NAME@$PACKAGE_VERSION 发布成功" echo "" else echo "⚠️ 跳过不存在的包: $package" fi done # 8. 创建 Git 标签 echo "🏷️ 创建 Git 标签..." git tag "v$COMMON_VERSION" echo "" # 9. 推送到远程仓库 echo "🔼 推送到远程仓库..." read -p "是否推送到远程仓库? (y/N) " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then git push origin master git push origin "v$COMMON_VERSION" echo "✅ 已推送到远程仓库" else echo "⚠️ 跳过推送,请手动执行:" echo " git push origin master" echo " git push origin v$COMMON_VERSION" fi echo "" echo "🎉 所有包发布完成!版本: v$COMMON_VERSION"