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

 

 

 

 

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