#!/bin/bash # SDK Tag 發布腳本 (僅限 dev 分支使用) # 用法: ./scripts/publish_sdk.sh # 此腳本執行後的行為說明: # 1.強制分支檢查:如果當前不是 dev 分支,腳本會立即報錯終止。 # 2.版本一致性檢查:它會讀取 packages/xxx/pubspec.yaml 裡面的 version 欄位。如果你輸入的參數是 1.1.0 但檔案裡寫的是 1.0.9,腳本會拒絕執行。這強制要求你必須在 PR 階段就正確更新版本號。 # 3.同步檢查:它會檢查本地的 dev 是否與遠端的 origin/dev 一致。這防止你在忘記 git pull 的情況下把 Tag 打在舊的 Commit 上。 # 4.防重複檢查:如果該 Tag 名稱(例如 networks_sdk/1.1.0)已經存在,腳本會報錯,防止覆蓋發布。 # 5.不修改檔案:此腳本不會修改任何代碼,它只負責「蓋章(打 Tag)」和「公告(Push Tag)」。 #操作流程: # 1.開發:在功能分支開發,手動更新 pubspec.yaml 的版本號。 # 2.審核:提交 PR,通過測試與 Code Review,合併進入 dev 分支。 # 3.發布: # •git checkout dev # •git pull # •執行 melos run publish:sdk:only -- # 範例: # melos run publish:sdk:only -- networks_sdk 1.1.0 # # 4.完成:Tag 已推送到遠端,其他專案可以引用該 Tag。 set -e # 顏色 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' CYAN='\033[0;36m' NC='\033[0m' # 檢查參數 if [ -z "$1" ] || [ -z "$2" ]; then echo -e "${RED}用法: $0 ${NC}" echo "例如: $0 networks_sdk v0.0.1" exit 1 fi SDK_NAME=$1 VERSION=$2 PACKAGE_DIR="packages/$SDK_NAME" TAG_NAME="${SDK_NAME}/${VERSION}" echo "" echo -e "${CYAN}開始 SDK 發布流程...${NC}" # 1. 檢查版本格式 (必須 vX.X.X) if [[ ! "$VERSION" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo -e "${RED}錯誤: 版本號必須為 vX.X.X 格式${NC}" echo "例如: v1.0.0" exit 1 fi # 去掉 v 用於與 pubspec.yaml 比對 VERSION_NO_V=${VERSION#v} # 2. 檢查目前分支 CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) if [ "$CURRENT_BRANCH" != "dev" ]; then echo -e "${YELLOW}當前分支為 ${CURRENT_BRANCH}${NC}" echo -e "${CYAN}正在切換到 dev 分支...${NC}" git checkout dev fi # 3. 同步遠端 dev echo -e "${CYAN}同步遠端 dev 分支...${NC}" git fetch origin --quiet echo -e "${CYAN}更新本地 dev...${NC}" git pull origin dev --quiet # 4. 檢查 SDK 目錄 if [ ! -f "$PACKAGE_DIR/pubspec.yaml" ]; then echo -e "${RED}錯誤: 找不到 $PACKAGE_DIR/pubspec.yaml${NC}" exit 1 fi # 5. 讀取 pubspec.yaml 版本 FILE_VERSION=$(grep "^version: " "$PACKAGE_DIR/pubspec.yaml" | sed 's/version: //') if [ "$FILE_VERSION" != "$VERSION_NO_V" ]; then echo -e "${RED}錯誤: 版本號不匹配${NC}" echo "輸入版本(tag): $VERSION" echo "pubspec.yaml: $FILE_VERSION" exit 1 fi # 6. 檢查 Tag 是否存在 if git rev-parse "$TAG_NAME" >/dev/null 2>&1; then echo -e "${RED}錯誤: Tag '$TAG_NAME' 已存在${NC}" exit 1 fi echo "" echo -e "${GREEN}========================================${NC}" echo -e "${GREEN}SDK Tag 發布${NC}" echo -e "${GREEN}========================================${NC}" echo "SDK Name: $SDK_NAME" echo "Version: $VERSION" echo "Tag: $TAG_NAME" echo "Branch: dev" echo "Commit: $(git rev-parse --short HEAD)" echo -e "${GREEN}========================================${NC}" echo "" echo -e "${YELLOW}警告:這將會在當前 commit 建立並推送 Git Tag。${NC}" echo -e "${YELLOW}如果確認發布,請輸入 'y' 並按 Enter。${NC}" echo -e "${YELLOW}輸入其他內容將取消發布。${NC}" # 重要:從 /dev/tty 讀取,避免 melos 吃掉輸入 echo -n "是否確定發布 $TAG_NAME ? [y/N]: " read confirm < /dev/tty if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then echo "" echo -e "${CYAN}發布已取消${NC}" exit 0 fi # 7. 建立 Tag echo "" echo -e "${GREEN}[1/2] 創建 Git Tag...${NC}" git tag "$TAG_NAME" # 8. 推送 Tag echo "" echo -e "${GREEN}[2/2] 推送 Tag 到遠端...${NC}" git push --tags --quiet echo "" echo -e "${GREEN}========================================${NC}" echo -e "${GREEN}Tag 發布成功!${NC}" echo -e "${GREEN}========================================${NC}" echo "現在可以在其他專案使用:" echo "ref: $TAG_NAME"