25 編譯依賴項目自制小腳本

前言

一般我們項目都會有很多的依賴, 然後 有些時候我們需要先 build 這些依賴的項目, 然後 才能 build 我們關注開發的項目 

然後 在有些場景下面 我們不能直接通過 IDE 導入我們的依賴, 直接 idea install 因爲 打包的之前之後 可能還有一些額外的需要處理的事情, 我們假定其爲 build.sh[來處理這一系列的工作] 

然後 我們的項目 build 之前, 需要先 執行 build.sh 腳本, 也許還還有第二個依賴 build2.sh, 第三個依賴等等 

然後 基於這種需求, 我這邊 整理了一個小腳本來處理滿足我這裏的需求的任務 

以下腳本基於 : MacOs Mojave 10.14.4 

以下腳本僅供參考 

 

 

參考代碼

我這裏的項目, 依賴於如下的 framework, 和 project 的編譯 

## imports
# source ./utils.sh


## constants
GIT_BASE="/Users/jerry/gitBase"
FRAMEWORK_MASK=1
PROJECT_MASK=2


## prepare, parse arguments and confirmation
compileModules=0
argsStr=$1
args=(${argsStr//+/ })
for arg in ${args[@]}
do
    if [[ $arg == all ]]; then
        compileModules=3
    fi
    if [[ $arg == f ]]; then
         compileModules=$(( compileModules | $FRAMEWORK_MASK ))
    fi
    if [[ $arg == p ]]; then
         compileModules=$(( compileModules | PROJECT_MASK ))
    fi
done

echo " compileModules : [$compileModules] "
masked=$(( $compileModules & $FRAMEWORK_MASK ))
if [ $masked -gt 0 ]; then
    echo " [framework]"
fi
masked=$(( $compileModules & $PROJECT_MASK ))
if [ $masked -gt 0 ]; then
    echo " [project]"
fi

read -p "是否需要繼續, n/N 終止 ... " doContinue
if [[ $doContinue == *n* ]] || [[ $doContinue == *N* ]]; then
    exit 0
fi


## for debug 
# exit 0


## do business related
startTime=`date +%s`

# if compile framework
masked=$(( $compileModules & $FRAMEWORK_MASK ))
if [ $masked -gt 0 ]; then 
   echo " start compile [framework]  without testcase "
   cd $GIT_BASE/framework
   sh ./build.sh
fi
frameworkEndTime=`date +%s`

# if compile project
masked=$(( $compileModules & $PROJECT_MASK ))
if [ $masked -gt 0 ]; then
   echo " start compile [project] without testcase at $frameworkEndTime "
   cd $GIT_BASE/applications/project 
   mvn clean install -Dmaven.test.skip 
fi 
projectEndTime=`date +%s`

endTime=`date +%s`


## summary 
frameworkSpent=$[ $frameworkEndTime - $startTime ]
projectSpent=$[ $projectEndTime - $frameworkEndTime ]
totalSpent=$[ $endTime - $startTime ]


## output 
echo " framework spent : $frameworkSpent s, project spent : $projectSpent s,  total spent : $totalSpent s .. "

osascript -e "display notification \"${strPrompt}\" with title \"buildDeps.sh finished ... \""

問題整理

當然從上面代碼來看, 也可以看出一些問題, 缺少一些 封裝的技巧 

整個腳本過於面向對象, 導致對於擴展支持不太友好, 取其精華去其糟粕 

 

腳本整體業務主要是有三個階段

第一部分, 解析參數, 並輸出需要編譯的模塊, 讓用戶確認編譯 
第二部分, 處理編譯的業務, 如果需要編譯某個業務模塊, 則編譯給定的模塊, 這裏沒有做封裝, 基本上模塊增加  需要複製粘貼 
第三部分, 統計各個模塊編譯的開銷時間, 以及彙總開銷時間, 然後 在來一段小腳本, 給用戶提示, 編譯完成 

 

然後裏面有一些 shell 知識點可能值得整理一下 

1. 字符串拆分 "args=(${argsStr//+/ })"

2. 遍歷數組 "for arg in ${args[@]}"

3. 按位或操作 "compileModules=$(( compileModules | $FRAMEWORK_MASK ))"

4. 按位與操作 "masked=$(( $compileModules & $FRAMEWORK_MASK ))"

5. 標準輸入 "read -p "是否需要繼續, n/N 終止 ... " doContinue"

6. 時間統計 "startTime=`date +%s`
endTime=`date +%s`
totalSpent=$[ $endTime - $startTime ]"

7. actionScript 輸出提示信息 " osascript -e "display notification \"${strPrompt}\" with title \"buildDeps.sh finished ... \"" "

 

 

使用演示 

1. 執行腳本輸出參數, 確認編譯

2. 編譯完成彙總信息, 通知到用戶

 

 

 

 

引用 

Mac OS X 執行osascript命令 : https://www.jianshu.com/p/d42dff738d70

之前有一篇我自己的文章, 翻了一下引用 : https://blog.csdn.net/u011039332/article/details/52357380

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章