组件管理
这种管理方式只适合使用本地组件的开发阶段,如果组件使用发版的,则需要通过版本管理来协同开发。
组件化后,出现几十个组件。组件的管理成为问题。
1、组件创建样式杂乱多样,使用方式不统一。
2、多人使用组件,组件更新后无法通知到。
3、新人跑项目,需要下载全部组件,操作麻烦。
处理这个问题最好的办法是使用包管理工具,使用shell脚本进行统一化批量操作。
组件创建
在公司进行项目组件化时,一般选择创建自己私有脚手架,方便进行统一配置。同时使用自己的私有仓库源管理发布版本。
iOS 创建三方库时,我们通常使用pod的pod lib create
命令,通过默认的官方脚手架创建工程。
如果与git仓库创建命令联合使用会更加高效。
具体步骤如下:
1、首先在GitLab服务器上新建项目
2、将项目下载下来
3、pod lib create命令创建组件
4、将创建的组件上传的服务器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#git server
export GITLAB_SERVER=https://git.jd.com
export GITLAB_SERVER_SSH=git.jd.com
#pod template url
export POD_TEMPLATE_URL=http://git.jd.com/ICPod/pod-template-icity.git
#token
export GITLAB_TOKEN=$1
#group name
export GITLAB_ROOTGROUP=$2
#project name
export GITLAB_PROJECT=$3
echo "++++++++++++++++++++++++++++++++ On GitLab creat ++++++++++++++++++++++++++++++++++++++++"
#
#search group
#
rootGroupId=$(curl --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \
"$GITLAB_SERVER/api/v4/groups?search=$GITLAB_ROOTGROUP" | \
python -c "import sys, json; print json.load(sys.stdin)[0]['id']"
)
echo "Root group Id: $rootGroupId"
#
#search or create a project
#
projectId=$(curl "$GITLAB_SERVER/api/v4/groups/$rootGroupId/projects?search=$GITLAB_PROJECT" \
-H "PRIVATE-TOKEN: $GITLAB_TOKEN" | \
python -c "import sys, json; print json.load(sys.stdin)[0]['id']"
)
if [$projectId == ""]
then
echo "Begin create project"
projectId=$(curl -d "path=$GITLAB_PROJECT&namespace_id=$rootGroupId&visibility=private" \
-X POST "$GITLAB_SERVER/api/v4/projects" \
-H "PRIVATE-TOKEN: $GITLAB_TOKEN" | \
python -c "import sys, json; print json.load(sys.stdin)['id']"
)
fi
echo "Project Id: $projectId"
#clone code
#需要先执行ssh-add ~/.ssh/id_rsa命令,达到免密,若电脑重启,则需再次执行
ssh-add ~/.ssh/id_rsa
git clone git@$GITLAB_SERVER_SSH:$GITLAB_ROOTGROUP/$GITLAB_PROJECT.git
echo "++++++++++++++++++++++++++++++++ pod creat lib ++++++++++++++++++++++++++++++++++++++++"
GITLAB_PROJECT_TEMP=${GITLAB_PROJECT}_temp
#修改代码目录,以避免pod lib create时目录重名
mv ./$GITLAB_PROJECT ./$GITLAB_PROJECT_TEMP
#通过pod生成sdk代码
pod lib create $GITLAB_PROJECT --template-url=$POD_TEMPLATE_URL
#删除pod生成的git文件,用temp目录中的git替换之,方便提交到自己的git仓库
rm -r -f ./$GITLAB_PROJECT/.git
mv ./$GITLAB_PROJECT_TEMP/.git ./$GITLAB_PROJECT/.git
#删除temp目录
rm -r -f ./$GITLAB_PROJECT_TEMP
echo "++++++++++++++++++++++++++++++++ commit code ++++++++++++++++++++++++++++++++++++++++"
#commit code
cd ./$GITLAB_PROJECT
git add .
git commit -m "Init code."
git push -u origin master
使用私有源时,只要添加source 'http://git.jd.com/iCityAppSDK/xxxxSpecs.git'
组件发版
组件的发版一般很简单,如iOS的发版使用pod repo push
命令就可以。
1
2
# xx-sdkspecs为自己的私有源 CityChooseSDK.podspec为自己的组件的podspec
pod repo push xx-sdkspecs CityChooseSDK.podspec --allow-warnings
组件批量下载
新员工要运行项目,得知需要先clone几十个组件时(组件未稳定,需要依赖本地项目),差点哭晕😃。
实现了一个批量下载组件脚本。
实现思路:
首先获取组下所有组件、然后clone下所有组件。
比较坑的是每页默认为20个,需要设置页数的大小,一次获取所有的组件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#git server
export GITLAB_SERVER=https://git.jd.com
export GITLAB_SERVER_SSH=git.jd.com
#token
export GITLAB_TOKEN=''
#group name
export GITLAB_ROOTGROUP='iCityAppSDK'
#group ID
export rootGroupId=123
ssh-add ~/.ssh/id_rsa
#
#search project count
#
echo $GITLAB_SERVER/api/v4/groups/$rootGroupId/projects
projectsCount=$(curl "$GITLAB_SERVER/api/v4/groups/$rootGroupId/projects?per_page=300" \
-H "PRIVATE-TOKEN: $GITLAB_TOKEN" | \
python -c "import sys, json; print len(json.load(sys.stdin))"
)
echo $projectsCount
#
#down project
#
for ((i=1;i<$projectsCount;i++))
do
projectUrl=$(curl "$GITLAB_SERVER/api/v4/groups/$rootGroupId/projects?per_page=300" \
-H "PRIVATE-TOKEN: $GITLAB_TOKEN" | \
python -c "import sys, json; print json.load(sys.stdin)[$i]['http_url_to_repo']"
)
echo "++++++++++++++++++++++++++++++++++++++++++++++"
echo total:$projectsCount this:$i url:$projectUrl
echo "++++++++++++++++++++++++++++++++++++++++++++++"
git clone $projectUrl
done
组件批量更新
实际使用时,老是有组件代码更新,但未下拉代码,导致项目无法运行。而且有时一次更新多个组件,所以需要批量更新组件的脚本。
组件的批量更新主要是扫描文件夹下所有的组件,然后拉最新代码。
但是有的时候会拉不到最新代码,所以需要先检查代码是否跟新。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for dir in $(ls)
do
if [ -d $dir ]; then
cd ./$dir
changed=0
git remote update && git status -uno | grep -q 'Your branch is behind' && changed=1
if [ $changed = 1 ]; then
#echo $dir
echo -e "\033[31m $dir \033[0m";
echo -e "\033[31m Your branch is behind \033[0m";
git pull
fi
cd ../
fi
done