diff --git a/README.md b/README.md index ac6c4e5..71873b0 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,16 @@ # customer-im-client 架构文档在 `Doc/IM_App_架构设计.html`,clone 到本地后用浏览器直接打开。 + +## 開發流程: + +## 主項目: +IDE開啟主項目project: +/custom-im-client/apps/im_app + +## 每次pull/fetch後: + +1. flutter put get + +2. 如果有新的.g文件引入失敗,可以透過指令生成: + melos run gen \ No newline at end of file diff --git a/packages/ReadMe.md b/packages/ReadMe.md new file mode 100644 index 0000000..1c8094d --- /dev/null +++ b/packages/ReadMe.md @@ -0,0 +1,32 @@ +# SDK 開發流程 + +## IDE 開啟方式 +請開啟 SDK 項目,**不要**直接開啟主項目或是根目錄。 +* **範例**:開發 `networks_sdk`,請開啟 `packages/networks_sdk` + +## 操作流程 + +1. **開發**:在功能分支開發,開發完成後手動更新 `pubspec.yaml` 的版本號。 +2. **審核**:提交 PR,通過測試與 Code Review,合併進入 `main` 分支。 +3. **發布**: + * `git checkout main` + * `git pull` + * 執行 `melos run publish:sdk:only -- ` + * **範例**:`melos run publish:sdk:only -- networks_sdk 1.1.0` +4. **完成**:Tag 已推送到遠端,其他專案可以引用該 Tag。 + +## 特殊情況 +在一些緊急情況,或是特別難單獨在sdk解決的問題,必須跟主項目一起操作才能重現時, +可以透過指令執行: + melos bootstrap:dev + +執行後會產生一個 pubspec.overrides.yaml 的檔案,會自動鏈結所有項目強制讀取這個yaml +此時主項目中pubspec.yaml的sdk標籤引用會失效,會直接讀取sdk本地內容,可以幫助解決問題。 + +## 注意 +如果使用特殊情況開發,開發完後,必須遵守: +1. 執行 melos clean 刪除pubspec.overrides.yaml 的檔案(不可提交到gitea) +2. 一樣必須走開發流程,不可主項目修改程式與sdk修改提交到同個commit。 + + + diff --git a/pubspec.yaml b/pubspec.yaml index f00c26c..3ca4b08 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -89,3 +89,15 @@ melos: remove:sdk: description: "Remove an SDK package and clean up all references. Usage: melos run remove:sdk -- " 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 + + bootstrap:dev: + description: "本地開發模式: 鏈接所有 SDK 到主項目 (melos bootstrap)" + run: melos bootstrap + + bootstrap:clean: + description: "清理本地開發模式: 移除 pubspec.overrides.yaml" + run: rm -f apps/im_app/pubspec.overrides.yaml \ No newline at end of file diff --git a/scripts/publish_sdk.sh b/scripts/publish_sdk.sh new file mode 100755 index 0000000..acc1361 --- /dev/null +++ b/scripts/publish_sdk.sh @@ -0,0 +1,119 @@ +#!/bin/bash +# SDK Tag 發布腳本 (僅限 main 分支使用) +# 用法: ./scripts/publish_sdk.sh + +# 此腳本執行後的行為說明: +# 1.強制分支檢查:如果當前不是 main 分支,腳本會立即報錯終止。 +# 2.版本一致性檢查:它會讀取 packages/xxx/pubspec.yaml 裡面的 version 欄位。如果你輸入的參數是 1.1.0 但檔案裡寫的是 1.0.9,腳本會拒絕執行。這強制要求你必須在 PR 階段就正確更新版本號。 +# 3.同步檢查:它會檢查本地的 main 是否與遠端的 origin/main 一致。這防止你在忘記 git pull 的情況下把 Tag 打在舊的 Commit 上。 +# 4.防重複檢查:如果該 Tag 名稱(例如 networks_sdk/1.1.0)已經存在,腳本會報錯,防止覆蓋發布。 +# 5.不修改檔案:此腳本不會修改任何代碼,它只負責「蓋章(打 Tag)」和「公告(Push Tag)」。 + +#操作流程: +# 1.開發:在功能分支開發,手動更新 pubspec.yaml 的版本號。 +# 2.審核:提交 PR,通過測試與 Code Review,合併進入 main 分支。 +# 3.發布: +# •git checkout main +# •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 1.0.0" + exit 1 +fi + +SDK_NAME=$1 +VERSION=$2 +PACKAGE_DIR="packages/$SDK_NAME" +TAG_NAME="${SDK_NAME}/${VERSION}" + +# 1. 檢查是否在 main 分支 +CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) +if [ "$CURRENT_BRANCH" != "main" ]; then + echo -e "${RED}錯誤: 此腳本只能在 'main' 分支執行。${NC}" + echo "當前分支為: $CURRENT_BRANCH" + echo "請先合併 PR 並切換至 main 分支後再執行。" + exit 1 +fi + +# 2. 檢查 SDK 目錄與 pubspec.yaml +if [ ! -f "$PACKAGE_DIR/pubspec.yaml" ]; then + echo -e "${RED}錯誤: 找不到 $PACKAGE_DIR/pubspec.yaml${NC}" + exit 1 +fi + +# 3. 檢查 pubspec.yaml 內部的版本號是否已經正確更新 +# 這是為了確保開發者在 PR 時已經手動改好了版本號 +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 的版本號並已合併。" + exit 1 +fi + +# 4. 檢查遠端是否有更新 (確保本地 main 是最新的) +echo -e "${CYAN}正在檢查遠端狀態...${NC}" +git fetch origin +LOCAL=$(git rev-parse HEAD) +REMOTE=$(git rev-parse origin/main) +if [ "$LOCAL" != "$REMOTE" ]; then + echo -e "${RED}錯誤: 本地 main 分支落後於遠端,請先執行 git pull。${NC}" + exit 1 +fi + +# 5. 檢查 Tag 是否已存在 +if git rev-parse "$TAG_NAME" >/dev/null 2>&1; then + echo -e "${RED}錯誤: Tag '$TAG_NAME' 已經存在。${NC}" + exit 1 +fi + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}SDK 正式發布 (Git Tag Only)${NC}" +echo -e "${GREEN}========================================${NC}" +echo "SDK Name: $SDK_NAME" +echo "Version: $VERSION" +echo "Tag: $TAG_NAME" +echo "Branch: main" +echo -e "${GREEN}========================================${NC}" + +# 確認訊息 +echo -e "${YELLOW}警告:這將會為當前 commit 創建並推送一個正式的 Tag。${NC}" +read -p "確定要發布 $TAG_NAME? (y/n): " confirm + +if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then + echo "已取消發布" + exit 0 +fi + +# Step 1: Create Tag +echo "" +echo -e "${GREEN}[1/2] 創建本地 Git Tag...${NC}" +git tag "$TAG_NAME" + +# Step 2: Push Tag +echo "" +echo -e "${GREEN}[2/2] 推送 Tag 到遠端...${NC}" +git push origin "$TAG_NAME" + +echo "" +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN} Tag 發布成功!${NC}" +echo -e "${GREEN}========================================${NC}" +echo "現在可以在其他項目中使用此版本:" +echo "ref: $TAG_NAME" \ No newline at end of file