@@ -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 <sdk-name> <version> ${ 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 "