From 2f380a761912e4e9005089fdc9e19e86978dda76 Mon Sep 17 00:00:00 2001 From: ethan Date: Tue, 10 Mar 2026 18:06:03 +0800 Subject: [PATCH] =?UTF-8?q?Update:=201.=E4=BF=AE=E6=AD=A3publish=E8=85=B3?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +-- packages/ReadMe.md | 12 +++--- pubspec.yaml | 4 +- scripts/publish_sdk.sh | 97 +++++++++++++++++++++++++----------------- 4 files changed, 67 insertions(+), 52 deletions(-) diff --git a/README.md b/README.md index 71873b0..6de69d1 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,5 @@ IDE開啟主項目project: ## 每次pull/fetch後: -1. flutter put get - -2. 如果有新的.g文件引入失敗,可以透過指令生成: - melos run gen \ No newline at end of file +如果有新的.g文件引入失敗,可以透過指令生成: +melos run gen \ No newline at end of file diff --git a/packages/ReadMe.md b/packages/ReadMe.md index 1c8094d..b4db273 100644 --- a/packages/ReadMe.md +++ b/packages/ReadMe.md @@ -7,25 +7,23 @@ ## 操作流程 1. **開發**:在功能分支開發,開發完成後手動更新 `pubspec.yaml` 的版本號。 -2. **審核**:提交 PR,通過測試與 Code Review,合併進入 `main` 分支。 +2. **審核**:提交 PR,通過測試與 Code Review,合併進入 `dev` 分支。 3. **發布**: - * `git checkout main` - * `git pull` - * 執行 `melos run publish:sdk:only -- ` - * **範例**:`melos run publish:sdk:only -- networks_sdk 1.1.0` + * 執行 `melos run publish:sdk -- ` + * **範例**:`melos run publish:sdk -- networks_sdk v1.1.0` 4. **完成**:Tag 已推送到遠端,其他專案可以引用該 Tag。 ## 特殊情況 在一些緊急情況,或是特別難單獨在sdk解決的問題,必須跟主項目一起操作才能重現時, 可以透過指令執行: - melos bootstrap:dev +melos bootstrap:dev 執行後會產生一個 pubspec.overrides.yaml 的檔案,會自動鏈結所有項目強制讀取這個yaml 此時主項目中pubspec.yaml的sdk標籤引用會失效,會直接讀取sdk本地內容,可以幫助解決問題。 ## 注意 如果使用特殊情況開發,開發完後,必須遵守: -1. 執行 melos clean 刪除pubspec.overrides.yaml 的檔案(不可提交到gitea) +1. 執行 melos bootstrap:clean 刪除pubspec.overrides.yaml 的檔案(不可提交到gitea) 2. 一樣必須走開發流程,不可主項目修改程式與sdk修改提交到同個commit。 diff --git a/pubspec.yaml b/pubspec.yaml index 3ca4b08..d514530 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -91,8 +91,8 @@ melos: run: bash scripts/remove_sdk.sh publish:sdk: - description: "發布 SDK 並更新主項目依賴. Usage: melos run publish:sdk -- " - run: bash scripts/release_sdk.sh $MELOS_ARG_1 $MELOS_ARG_2 + description: "發布 SDK. Usage: melos run publish:sdk -- " + run: bash scripts/publish_sdk.sh bootstrap:dev: description: "本地開發模式: 鏈接所有 SDK 到主項目 (melos bootstrap)" diff --git a/scripts/publish_sdk.sh b/scripts/publish_sdk.sh index 6f340b2..2e5b1db 100755 --- a/scripts/publish_sdk.sh +++ b/scripts/publish_sdk.sh @@ -20,9 +20,10 @@ # 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' @@ -32,7 +33,7 @@ NC='\033[0m' # 檢查參數 if [ -z "$1" ] || [ -z "$2" ]; then echo -e "${RED}用法: $0 ${NC}" - echo "例如: $0 networks_sdk 1.0.0" + echo "例如: $0 networks_sdk v0.0.1" exit 1 fi @@ -41,79 +42,97 @@ VERSION=$2 PACKAGE_DIR="packages/$SDK_NAME" TAG_NAME="${SDK_NAME}/${VERSION}" -# 1. 檢查是否在 dev 分支 -CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) -if [ "$CURRENT_BRANCH" != "dev" ]; then - echo -e "${RED}錯誤: 此腳本只能在 'dev' 分支執行。${NC}" - echo "當前分支為: $CURRENT_BRANCH" - echo "請先合併 PR 並切換至 dev 分支後再執行。" +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 -# 2. 檢查 SDK 目錄與 pubspec.yaml +# 去掉 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 -# 3. 檢查 pubspec.yaml 內部的版本號是否已經正確更新 -# 這是為了確保開發者在 PR 時已經手動改好了版本號 +# 5. 讀取 pubspec.yaml 版本 FILE_VERSION=$(grep "^version: " "$PACKAGE_DIR/pubspec.yaml" | sed 's/version: //') -if [ "$FILE_VERSION" != "$VERSION" ]; then - echo -e "${RED}錯誤: 版本號不匹配!${NC}" - echo "參數輸入的版本為: $VERSION" - echo "pubspec.yaml 內的版本為: $FILE_VERSION" - echo "請確保已在 PR 中更新了 pubspec.yaml 的版本號並已合併。" + +if [ "$FILE_VERSION" != "$VERSION_NO_V" ]; then + echo -e "${RED}錯誤: 版本號不匹配${NC}" + echo "輸入版本(tag): $VERSION" + echo "pubspec.yaml: $FILE_VERSION" exit 1 fi -# 4. 檢查遠端是否有更新 (確保本地 dev 是最新的) -echo -e "${CYAN}正在檢查遠端狀態...${NC}" -git fetch origin -LOCAL=$(git rev-parse HEAD) -REMOTE=$(git rev-parse origin/dev) -if [ "$LOCAL" != "$REMOTE" ]; then - echo -e "${RED}錯誤: 本地 dev 分支落後於遠端,請先執行 git pull。${NC}" - exit 1 -fi - -# 5. 檢查 Tag 是否已存在 +# 6. 檢查 Tag 是否存在 if git rev-parse "$TAG_NAME" >/dev/null 2>&1; then - echo -e "${RED}錯誤: Tag '$TAG_NAME' 已經存在。${NC}" + echo -e "${RED}錯誤: Tag '$TAG_NAME' 已存在${NC}" exit 1 fi +echo "" echo -e "${GREEN}========================================${NC}" -echo -e "${GREEN}SDK 正式發布 (Git Tag Only)${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 -e "${YELLOW}警告:這將會為當前 commit 創建並推送一個正式的 Tag。${NC}" -read -p "確定要發布 $TAG_NAME? (y/n): " confirm +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 "" + echo -e "${CYAN}發布已取消${NC}" exit 0 fi -# Step 1: Create Tag +# 7. 建立 Tag echo "" -echo -e "${GREEN}[1/2] 創建本地 Git Tag...${NC}" +echo -e "${GREEN}[1/2] 創建 Git Tag...${NC}" git tag "$TAG_NAME" -# Step 2: Push Tag +# 8. 推送 Tag echo "" echo -e "${GREEN}[2/2] 推送 Tag 到遠端...${NC}" -git push origin "$TAG_NAME" +git push --tags --quiet echo "" echo -e "${GREEN}========================================${NC}" -echo -e "${GREEN} Tag 發布成功!${NC}" +echo -e "${GREEN}Tag 發布成功!${NC}" echo -e "${GREEN}========================================${NC}" -echo "現在可以在其他項目中使用此版本:" + +echo "現在可以在其他專案使用:" echo "ref: $TAG_NAME" \ No newline at end of file