iOS 关于Bifrost组件化项目创建步骤

669 阅读4分钟

目标:多工程联编的方式,Workspace内多project开发

1. 创建一个Workspace,这个是一个空的Workspace

  • D4916064-57E7-42E1-8AAA-9EEA1446C382.png
  • 自己创建一个文件夹,把workspace放进去
    • 1B37CB43-99B7-4186-A098-306B6719EFD4.png

2. 打开Workspace,会看到一个空的工作空间,什么都没有

  • 28D45055-1069-4CED-AFA2-8193C1092609.png

3. 创建一个主project:

3.1. D3A39173-D71E-446F-8480-54DFD5F3378D.png E5EEA7DD-3265-4276-8DCE-E598451EEBA2.png 这个工作空间下的主工程创建成功:

  • C7975240-333C-4242-BF13-B98E09C5F8D9.png

4. 创建子工程,这里就是我们的组件模块,一个项目就是一个组件,把代码隔离开,让他们不能自由的调用

4.1 D4916064-57E7-42E1-8AAA-9EEA1446C382.png E5EEA7DD-3265-4276-8DCE-E598451EEBA2.png 2022-04-21 16.23.24.png 组件模块创建成功: F2AAFC42-9ADA-4A29-9FD2-17C1C0129349.png 删除不必要的文件,剩下下面几个文件: 5E986088-F653-4342-9ACF-E1E21CB38F55.png

5. 把子项目的 target 改为static library,这样子项目(组件)才能被主项目调用

5.1 先删掉之前的target

8BD00B58-3652-467B-B556-617CEECE66B5.png

5.2 在target下面添加 static library

4D97F768-B959-457E-B80C-41FB34B7B378.png B2CAA874-56A8-43A0-B31F-60CF0064B5A1.png

  • 里面出现两个ModuleA文件夹,我们根据需要删掉其中一个引用就行,注意那些未引用的文件重新引用进来

6. 创建Bundle,同样在target处点“+”

11719BEA-0159-4BDB-85B4-02DE6D0C6CD9.png 403E0277-15EB-4D7B-A870-7CEBD8122C3A.png 把原来Assets文件夹先删除引用,重新添加进工程 338A5CC2-C2E0-485C-A2D0-AD95DAF4355D.png

在ModuleA本地的文件夹里面新建ModuleABundle文件夹,用来存放所有资源文件,Assets文件夹也移到里面去 890EA012-B3B6-48F4-8577-B6734CDB26BE.png 把ModuleABundle文件夹add进项目,info文件也可以放里面 2022-04-21 17.00.57.png

成功把资源文件和类文件分离开: 2022-04-21 17.05.55.png

7. 同样的方法创建一个ModuleB

F789D0F8-8150-4616-9AE7-B80E0A5F530E.png

8. 模块调用

8.1 主工程调用子工程:

2022-04-21 17.21.44.png EAD7DA96-D829-4D88-A1C9-29BA6F0C0D5A.png 添加依赖: 8D9249F7-B057-4C9B-A138-ECB60E75A466.png

8.2 到这里就实现了主项目对子项目的文件跨项目调用了:

2E645049-B6C9-4B3E-8707-1673E5A2FC98.png

ModuleA 和 ModuleB 因为都在同一个模块中同时导入过,他们不用再重新按上面的流程设置依赖,他们可以直接相互调用了

8.3子模块间的调用,设置里面不用设置依赖:

2D80E178-C524-404C-943C-3DB9311D5EFA.png

上面主要为了展示整个流程,在实际开发中,主工程主要引入路由、common等这些公共模块,其他那些子项目根据情况,可不相互引用的尽量不要引用,因为要防止在开发过程中出现直接耦合其他模块的情况。

9. Static Library和Framework的共同点和区别

  1. 共同点:
  • 两者其实都可以是静态库。
  1. 主要不同点:

    1.承载的内容范畴:

    • Static Library的产出物只是一个.a文件,为二进制执行文件。分享给别人的时候,头文件、静态资源文件需要另外提供。
    • Framework为一站式分享方案,其实是一个文件夹,其中包含代码签名、头文件、二进制执行文件、静态资源文件等。

    2.头文件搜索路径的区别:StaticLibrary需要设置头文件搜索路径,Framework不需要。

    3.当存在对外部代码库依赖的时候

    • StaticLibrary:能够只引用外部库的头文件,调用外部库的公开方法,而不引入其库实现,实现与引用库的分离部署。
    • Framework:要引用一个外部库,就必须要将此外部库的实现放入Framework内编译才可以。如果要想达到StaticLibrary的效果,可以使用运行时方式调用。

    4.运行环境(对3的理解升级)

    • StaticLibrary:共享其运行环境,假如其运行环境中包换库中同一个类,会发生代码冲突,必须剥离其中一方的此类,然后共享此类。
    • Framework:与其运行环境隔离,假如其运行环境中包换库中同一个类,不会发生冲突,同名的两个类会在各自的环境中独立运行,互不干扰,哪怕是单例类。

    5.综合,如何选择使用Framework还是StaticLibrary

    • 假如不想在同一个App中包含多份三方库(减小包大小),可以使用StaticLibrary,库本身和App共享第三方库。但是产出物的结构可能会比较乱。
    • 假如不想考虑和App的代码冲突问题,库本身独立使用需要的库,想提供比较好的库结构,可以使用Framework。但是假如库本身和App都使用了同一个三方库,会存在两份三方库,会增加包大小。

10. 温馨提示

如果类里面的+load方法不执行,给Other Link Flags加上-ObjC

可以查看Bifrost原Demo