我们公司在平时的工作中经常需要根据甲方粑粑的要求去做一些特殊的需求,或者更改一些特定版本的bug,所以平时经常会需要出一些单点包给到现场。原先出单点包的时候,需要手动创建对应的package的目录,并把编译后的class文件手动拷贝到对应的package中,如果只是一两个类还好,修改太多的话,一个一个去创建目录,拷贝class,那真的是一件能让人抓狂的事情。
下面写了一个脚本,我本地是windows系统,为了方便执行shell脚本,装了一个ubuntu的应用。
#!/bin/bash
classes=""
# 指定项目名称,默认demo,可以提示用户手动输入
[ ! -n "$pname" ] && pname=demo
read -p "Please input project name (default:$pname): " project_name
project_name=${project_name:-$pname}
#定位要查找的class的路径
classpath=/mnt/d/work/$project_name/target/classes
cd $classpath
pwd
echo "classpath:"$classpath
i=0
# 拼接查询语句,更改的类需要在changeFile.txt文件中填写
while read line
do
if [ $i -eq 0 ]; then
classes=$classes" "$line"*.class"
else
classes=$classes" -o -name "$line"*.class"
fi
i=1
done < ~/translate/changeFile.txt
echo "classes=>"$classes
# 把生成的路径存储在mylog.log文件中
# 存储的路径示例 ./com/example/demo/trie/MetricTrie.class
find . -name $classes 2>&1 > ~/translate/mylog.log
cd ~/translate
while read line
do
# 创建对应目录,并把class拷贝到对应目录
part1=$(dirname "$line")
echo "part1:"$part1
if [ ! -d $part1 ]; then
mkdir -p $part1
fi
# 拼接目录的时候需要把多余的 . 去掉
echo "from path:"$classpath${line#"."}
cp -rf $classpath${line#"."} $part1/
done < ~/translate/mylog.log
功能比较简单,如果用java写,结合gitlab对应的api,应该可以搞出更智能的版本,比如根据分支的提交去生成单点包。等有精力和时间的时候去看看。不知道现在的集成工具有没有现成的,我们平时用到的Jenkins都是打完整个包,没有单独打单点包的。