美文网首页APP & program
iOS组件化的创建

iOS组件化的创建

作者: woniu | 来源:发表于2022-11-18 18:49 被阅读0次

    当公司的项目越来越大的时候,为了便于管理,组件库就成了一个很好的选择,便于我们开发维护以及在不同的项目中使用。下面我们来走一遍组件库的创建流程:
    我们创建一个工具类的组件库,命名为ZKFoundation库。

    一、创建组件库

    pod lib create ZKFoundation
    

    接下来会弹出来几个问题:

    1、What platform do you want to use?? [ iOS / macOS ]  选:iOS
    2、What language do you want to use?? [ Swift / ObjC ]   根据需要选择语言
    3、Would you like to include a demo application with your library? [ Yes / No ] //是否创建包含组件的demo
    4、Which testing frameworks will you use? [ Specta / Kiwi / None ] 使用那些测试框架,选None
    5、Would you like to do view based testing? [ Yes / No ] 你是否要执行基于view的测试
    6、What is your class prefix? 你类的前缀是什么?
    

    根据我们的设置生成的pod工程。


    image.png

    工程内容:


    image.png
      pod 'ZKFoundation', :path => '../'  本地库的引入方式
    

    在ZKFoundation里面编写代码。

    二、编写注意事项

    1、在编写的时候,我们可以直接通过pod 'ZKFoundation', :path => '../' 的方式引用,把创建的组件库放到我们的工程里面,然后使用,提交代码的时候,只提交这个本地库的就可以。
    2、每次创建或者删除组件库中的类之后,要在这个组件库里面pod install一下,然后在我们整个项目的pod install,防止找不到类的错误。
    3、创建一个头文件,将所有的类的头文件放到里面,方便外部直接引用哦。


    image.png

    4、在ZKFoundation-prefix中可以定义宏方法,方便我们调用


    image.png

    三、添加依赖

    项目中我们一般会引用其他库或者第三方库,就需要我们添加相应的依赖。
    在ZHFoundation.podspec中,添加相关依赖:

      s.dependency 'AFNetworking', '4.0.1'
      s.dependency 'UMCommon'
      s.dependency 'IKCrypt'
    

    这样在我们pod引入ZHFoundation库的时候就会自动引入相关库,供我们的库使用。

    四、打tag

    引入的时候根据tag引入我们的工程中。

    zhanyingzhu@zhanyingdeMacBook-Pro-3 TYTShareAndMobEvent % git add .
    zhanyingzhu@zhanyingdeMacBook-Pro-3 TYTShareAndMobEvent % git commit -m "tag=0.0.2-beta"
    [master 6f4c338] tag=0.0.2-beta
     2 files changed, 1 insertion(+), 3 deletions(-)
    zhanyingzhu@zhanyingdeMacBook-Pro-3 TYTShareAndMobEvent % git push
    zhanyingzhu@zhanyingdeMacBook-Pro-3 TYTShareAndMobEvent % git tag -a "0.0.2-beta" -m "1、 此版本为0.1.0版本的beta版,上传相关类和依赖。"
    zhanyingzhu@zhanyingdeMacBook-Pro-3 TYTShareAndMobEvent % git push origin --tags
    Enumerating objects: 1, done.
    Counting objects: 100% (1/1), done.
    Writing objects: 100% (1/1), 231 bytes | 231.00 KiB/s, done.
    Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
    To 192.168.2.20:iOS-Components/TYTShareAndMobEvent.git
     * [new tag]         0.0.2-beta -> 0.0.2-beta
    zhanyingzhu@zhanyingdeMacBook-Pro-3 TYTShareAndMobEvent % git tag               
    0.0.1-beta
    0.0.2-beta
    

    这样tag就完成了。引入我们项目中如下:

      pod 'TYTShareAndMobEvent', :git => 'git@192.168.2.18:iOS-Components/TYTShareAndMobEvent.git', :tag => '0.0.2-beta'
    

    然后调用pod update TYTShareAndMobEvent --no-repo-update更新最新的版本。

    打tag遇到的问题:
    To 192.168.2.20:iOS-Components/TYTFoundation.git
     * [new tag]         0.1.6-beta -> 0.1.6-beta
     ! [rejected]        0.1.4-beta -> 0.1.4-beta (already exists)
     ! [rejected]        0.1.5-beta -> 0.1.5-beta (already exists)
    error: failed to push some refs to '192.168.2.20:iOS-Components/TYTFoundation.git'
    hint: Updates were rejected because the tag already exists in the remote.
    

    更新被拒绝,因为tag在远端已经存在了。
    1,执行命令 获取所有的标签

    git pull --tags
    

    2、执行命令 覆盖本地存在的标签冲突

    git pull --tags -f 
    

    然后再git pul git push就可以了。


    image.png

    3、删除tag:
    如果提交tag之后,返现这次提交的有问题,又不想增加tag,那么我们可以删除tag,修改代码完毕push之后,再次打tag提交。

    zhanyingzhu@zhanyingdeMacBook-Pro-3 Example % git tag
    0.0.1-beta
    0.0.2-beta
    0.0.3-beta
    0.0.4-beta
    0.1.0
    0.1.5-beta
    zhanyingzhu@zhanyingdeMacBook-Pro-3 Example % git tag -d 0.1.0
    Deleted tag '0.1.0' (was 0c9b704)
    zhanyingzhu@zhanyingdeMacBook-Pro-3 Example % git push origin :refs/tags/0.1.0
    To 192.168.2.20:iOS-Components/TYTShareAndMobEvent.git
     - [deleted]         0.1.0
    

    五、组件库提交标准:

    1、依赖的第三方库版本都要写上。
    2、依赖的自己的组件库版本、tag不需要写,否则,组件库的版本号、tag一变动,那么依赖就会有问题。因为库没有更新。
    3、podspace本地库的版本号s.version = ‘0.1.5-beta’,要随时变动。否则虽然代码拉的是最新的tag,但是版本号却依然是旧的版本号0.1.4。 虽然说用起来没问题,但是看着对不上版本号也是闹心。
    4、组件库依赖的三方库,可以在主工程中删除掉。在pod install的时候会自动引入。

    六、Pod 私有库创建&组件化的实践

    传送门(https://www.jianshu.com/p/8219d29fea17)

    七、git stash (暂存)

    1、先git status获取当前的修改的状态。
    2、然后使用git stash暂存现在所有的修改文件。
    3、 git log获取以前提交的所有内容。

    zhanyingzhu@zhanyingdeMacBook-Pro-3 client_program % git log
    commit 549b8ebd5240089872d62831e71c977c594842b4 (HEAD -> dev_6270, origin/dev_6270)
    Author: Bubble <huobingbing@teyuntong.com>
    Date:   Wed Nov 30 13:53:52 2022 +0800
    
        Podfile udpate
    
    commit 6c7da301cf6ca6a39619b9b5457b03ec97bedf7b  //这个
    Author: chaoyakai <chaoyakai@teyuntong.com>
    Date:   Wed Nov 30 10:44:00 2022 +0800
    
        fix: 文案修改
    
    commit 026e7d419f91233efdf6e6949fe1c21093012b63
    Author: chaoyakai <chaoyakai@teyuntong.com>
    Date:   Wed Nov 30 10:30:39 2022 +0800
    
        fix: 文案修改
    

    4、然后选取我们要回退的版本id。
    git reset --hard 6c7da301cf6ca6a39619b9b5457b03ec97bedf7b
    5、pod instlal拉取这个提交的所有代码,运行代码(没问题)
    6、git stash list 查看暂存的所有的内容

    zhanyingzhu@zhanyingdeMacBook-Pro-3 client_program % git stash list
    stash@{0}: WIP on dev_6270: 549b8ebd Podfile udpate
    stash@{1}: On dev_6270: TYTGoodsDetailController冲突处理
    

    7、恢复所有的代码

    zhanyingzhu@zhanyingdeMacBook-Pro-3 client_program % git stash apply stash@{0}
    On branch dev_6270
    Your branch is up to date with 'origin/dev_6270'.
    
    Changes not staged for commit:
      (use "git add/rm <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
        modified:   Common/Launch/Task/TYTAgreedPrivacyTask.m
        modified:   Common/role/TYTSelectedRoleTools.m
        modified:   MBTytOne.xcodeproj/project.pbxproj
        deleted:    TytCars/Classes/Other/lib/Encapsulation/TYTDataManager.h
        deleted:    TytCars/Classes/Other/lib/Encapsulation/TYTDataManager.m
    

    如果要查看相应的修改:git diff TytCars/PrefixHeader-Cars.pch
    8、然后就是走提交代码那一套流程了。git add . 以及之后的代码

    八、上传到pod远端中

    1、验证podspec索引文件
    通过 pod spec lint --verbose --allow-warnings --use-libraries命令验证 podspec 索引文件。
    2、提交索引文件到远程索引库
    验证通过之后,pod repo push 本地索引库 索引文件名 --verbose --allow-warnings --use-libraries将索引文件提交的到远程索引库。
    pod repo push WJHSpecs WJHBaseWidgets.podspec --verbose --allow-warnings --use-libraries
    组件库的提交和静态库的提交略有不同,详见之前写的文章。
    https://www.jianshu.com/p/f0a90a119b98

    Pod有依赖的提交到远端:

    1、将代码提交到仓库。git push

    2、打tag,注意和podspace文件中的s.tag = 0.1.0相同。
    git tag -a "0.1.0" -m "1.此版本为0.1.0正式版本"
    git push —-tags

    3、提交完毕之后校验
    pod lib lint --allow-warnings --verbose —sources=gitee-mirrors-cocoapods-specs,amh-group-iosymm-mb-specrepo,amh-group-cocoapods-mb-thirdpartyspecrepo,2-cocoapods-tyt-specs
    这四个源分别是我们工程中依赖到的相关源
    其中相应的source就是我们工程中以来的source源。注意不要写https,通过pod repo list来查看本地源。然后填写在—sources=后面。校验没问题之后,到最后一步提交。
    4、提交
    REPO_NAME:本地的文件名
    加上提交的podspec文件
    pod repo push 2-cocoapods-tyt-specs TYTShareAndMobEvent.podspec --verbose --allow-warnings

    报错,提交过程中提示我要输入github的账号和密码,莫名其妙,工程中用的是gitlab,怎么也不会是github,一查才发现是podspec文件中的源s.source = 写的是github地址。需要改成我们项目的地址,使用ssh的地址即可。

    还有一个Xcode版本的问题,在Xcode14中,podfile使用use_modular_headers!,也就是使用代码的方式,不要使用use_frameworks!,这样会使用framework,clean之后编译总会报找不到MBProgressUD三方库文件找不到的问题。

    这样也算是走了一整个流程下来了。开始的时候各种懵逼,自己都觉得尴尬,这一天下来也算是心里有点谱了。

    相关文章

      网友评论

        本文标题:iOS组件化的创建

        本文链接:https://www.haomeiwen.com/subject/zevpxdtx.html