iOS

组件管理

"组件化多组件管理"

Posted by wanglilong on July 17, 2020

组件管理

这种管理方式只适合使用本地组件的开发阶段,如果组件使用发版的,则需要通过版本管理来协同开发。

组件化后,出现几十个组件。组件的管理成为问题。

1、组件创建样式杂乱多样,使用方式不统一。

2、多人使用组件,组件更新后无法通知到。

3、新人跑项目,需要下载全部组件,操作麻烦。

处理这个问题最好的办法是使用包管理工具,使用shell脚本进行统一化批量操作。

cocoapod官方文档

组件创建

在公司进行项目组件化时,一般选择创建自己私有脚手架,方便进行统一配置。同时使用自己的私有仓库源管理发布版本。

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