Closed njuxjy closed 4 years ago
是存在多个私有源么?目前插件 pod bin spec lint和pod bin repo push包含了 pod spec lint 和 pod repo push 的 options,可以通过 --sources=A,B 来指定除了 bin.yml 配置文件两个私有源外的额外的源
pod bin archive 我也加下好了
嗯,确实存在多个私有源。 嗯,archive最好也能加下,不然只能用pod packager打包了
已经发布了 不过感觉多个私有源不方便,源码一个,二进制一个差不多了,不清楚你是什么样的场景
感谢。 历史原因,公司内部时间长了以后不同组各自可能都维护了自己的私有源,依赖多个组的组件就指定了多个私有源
这种情况下,如果你用到了插件切换二进制、源码,可能会有问题 因为插件目前只能设置一个源码私有源和一个二进制私有源,如果在 bin.yml 里面的源码私有源里面不包含某个组件,而是在外部加的源里面,插件就不知道这个源是源码的还是二进制的了。
其实我感觉如果有权限的话,把源码私有源统一到一个仓库对以后也挺有帮助的,包括统一分析组件什么的。 可以新建一个仓库,然后给其他私有源仓库加 webhook ,把其他私有源的更新都同步到这个仓库里面。 插件里面有一些命令都是基于每种类型的源只有一个的基础上,去做减少输入参数处理的。 比如 pod bin repo push ,就是直接推送到 bin.yml 里面的源码私有源,这个命令没有加推送到指定私有源的 option
这种情况下,如果你用到了插件切换二进制、源码,可能会有问题 因为插件目前只能设置一个源码私有源和一个二进制私有源,如果在 bin.yml 里面的源码私有源里面不包含某个组件,而是在外部加的源里面,插件就不知道这个源是源码的还是二进制的了。
这两天在把一个复杂组件二进制化,趟坑中,完了以后会试下源码和二进制化切换,看看会不会有什么问题
其实我感觉如果有权限的话,把源码私有源统一到一个仓库对以后也挺有帮助的,包括统一分析组件什么的。 可以新建一个仓库,然后给其他私有源仓库加 webhook ,把其他私有源的更新都同步到这个仓库里面。 插件里面有一些命令都是基于每种类型的源只有一个的基础上,去做减少输入参数处理的。 比如 pod bin repo push ,就是直接推送到 bin.yml 里面的源码私有源,这个命令没有加推送到指定私有源的 option
权限没什么问题。你说的这个倒也可以考虑,不过目前牵涉面有点大,不同业务之间会交叉依赖一些私有源,改动起来还是有一定成本。万不得已下再尝试下
其实我感觉如果有权限的话,把源码私有源统一到一个仓库对以后也挺有帮助的,包括统一分析组件什么的。 可以新建一个仓库,然后给其他私有源仓库加 webhook ,把其他私有源的更新都同步到这个仓库里面。 插件里面有一些命令都是基于每种类型的源只有一个的基础上,去做减少输入参数处理的。 比如 pod bin repo push ,就是直接推送到 bin.yml 里面的源码私有源,这个命令没有加推送到指定私有源的 option
权限没什么问题。你说的这个倒也可以考虑,不过目前牵涉面有点大,不同业务之间会交叉依赖一些私有源,改动起来还是有一定成本。万不得已下再尝试下
个人感觉私有源只是指明了组件的搜索入口,只要组件的 podspec 一样,业务组的私有源和新增的统一私有源可以同时存在,最终决定用哪个私有源是 Podfile 决定的,也就是说成本应该只有新增私有源仓库,同步 podspec 这两个,业务组想用哪个源都可以,不影响业务组现有的依赖关系,最终也可以慢慢过渡到新增的统一私有源。
感觉业务之间会交叉依赖一些私有源并不影响私有源的统一,不知道你的实际情况如何,我这边虽然没有遇到你这种需要统一私有源的情况,不过给私有源仓库添加 webhook,然后把组件信息同步到数据库这一步还是有做的,如果只是这个,webhook 会带回完整的增删改信息,通过 gitlab api 获取业务源的 podspec 文件,再通过 gitlab api 同步到新增仓库中,只要有个简单的 web 服务器就行
这种情况下,如果你用到了插件切换二进制、源码,可能会有问题 因为插件目前只能设置一个源码私有源和一个二进制私有源,如果在 bin.yml 里面的源码私有源里面不包含某个组件,而是在外部加的源里面,插件就不知道这个源是源码的还是二进制的了。
我现在遇到个问题,不知道和你说的这个有没有关系。
环境: cocoapods 1.7.5 pod bin init设置的源码私有源地址:git@gitlab.xxx.com:iOS/Specs1.git pod bin init设置的二进制私有源地址:git@gitlab.xxx.com:iOS/BinarySpecs.git Podfile:
# 私有source spec repo 1
source 'git@gitlab.xxx.com:iOS/Specs1.git'
# 私有source spec repo 2
source 'git@gitlab.xxx.com:iOS/Specs2.git'
# 私有source spec repo 3
source 'git@gitlab.xxx.com:iOS/Specs3.git'
# 私有source spec repo 4
source 'git@gitlab.xxx.com:iOS/Specs4.git'
install! 'cocoapods',
generate_multiple_pod_projects: true,
disable_input_output_paths: true,
incremental_installation: true
plugin 'cocoapods-bin'
use_binaries!
有两个Pod, PodA依赖PodB,PodA中用尖括号方式import PodB中头文件:
#import <PodB/PodB.h>
PodA和PodB的spec都在源码私有源 git@gitlab.xxx.com:iOS/Specs1.git 中。
情况一:PodA和PodB都采用源码版本,相应的Podfile:
use_binaries!
set_use_source_pods ['PodA', 'PodB']
这种情况可以正常编译
情况二:PodA采用源码版本,PodB采用二进制版本,相应的Podfile:
use_binaries!
set_use_source_pods ['PodA']
这种情况无法正常编译,在PodA import PodB头文件的地方报 <PodB/PodB.h> 头文件找不到。
不知道作者有没遇到过这情况
其实我感觉如果有权限的话,把源码私有源统一到一个仓库对以后也挺有帮助的,包括统一分析组件什么的。 可以新建一个仓库,然后给其他私有源仓库加 webhook ,把其他私有源的更新都同步到这个仓库里面。 插件里面有一些命令都是基于每种类型的源只有一个的基础上,去做减少输入参数处理的。 比如 pod bin repo push ,就是直接推送到 bin.yml 里面的源码私有源,这个命令没有加推送到指定私有源的 option
权限没什么问题。你说的这个倒也可以考虑,不过目前牵涉面有点大,不同业务之间会交叉依赖一些私有源,改动起来还是有一定成本。万不得已下再尝试下
个人感觉私有源只是指明了组件的搜索入口,只要组件的 podspec 一样,业务组的私有源和新增的统一私有源可以同时存在,最终决定用哪个私有源是 Podfile 决定的,也就是说成本应该只有新增私有源仓库,同步 podspec 这两个,业务组想用哪个源都可以,不影响业务组现有的依赖关系,最终也可以慢慢过渡到新增的统一私有源。
感觉业务之间会交叉依赖一些私有源并不影响私有源的统一,不知道你的实际情况如何,我这边虽然没有遇到你这种需要统一私有源的情况,不过给私有源仓库添加 webhook,然后把组件信息同步到数据库这一步还是有做的,如果只是这个,webhook 会带回完整的增删改信息,通过 gitlab api 获取业务源的 podspec 文件,再通过 gitlab api 同步到新增仓库中,只要有个简单的 web 服务器就行
感觉确实能做,从单一私有源拉取也比较干净。内部现有的私有源较多,按业务和用途切分:
技术上迁移问题不大,推动业务部门去用统一的源需要花点力气。业务都是倾向于稳定,没事都懒得改动。如果不用统一的私有源也能实现组件二进制,业务就倾向于保持不变。不过试下来多个私有源可能确实有些问题,比如我上个回复中提到的那个问题。
这种情况下,如果你用到了插件切换二进制、源码,可能会有问题 因为插件目前只能设置一个源码私有源和一个二进制私有源,如果在 bin.yml 里面的源码私有源里面不包含某个组件,而是在外部加的源里面,插件就不知道这个源是源码的还是二进制的了。
我现在遇到个问题,不知道和你说的这个有没有关系。
环境: cocoapods 1.7.5 pod bin init设置的源码私有源地址:git@gitlab.xxx.com:iOS/Specs1.git pod bin init设置的二进制私有源地址:git@gitlab.xxx.com:iOS/BinarySpecs.git Podfile:
# 私有source spec repo 1 source 'git@gitlab.xxx.com:iOS/Specs1.git' # 私有source spec repo 2 source 'git@gitlab.xxx.com:iOS/Specs2.git' # 私有source spec repo 3 source 'git@gitlab.xxx.com:iOS/Specs3.git' # 私有source spec repo 4 source 'git@gitlab.xxx.com:iOS/Specs4.git' install! 'cocoapods', generate_multiple_pod_projects: true, disable_input_output_paths: true, incremental_installation: true plugin 'cocoapods-bin' use_binaries!
有两个Pod, PodA依赖PodB,PodA中用尖括号方式import PodB中头文件:
#import <PodB/PodB.h>
PodA和PodB的spec都在源码私有源 git@gitlab.xxx.com:iOS/Specs1.git 中。
情况一:PodA和PodB都采用源码版本,相应的Podfile:
use_binaries! set_use_source_pods ['PodA', 'PodB']
这种情况可以正常编译
情况二:PodA采用源码版本,PodB采用二进制版本,相应的Podfile:
use_binaries! set_use_source_pods ['PodA']
这种情况无法正常编译,在PodA import PodB头文件的地方报 <PodB/PodB.h> 头文件找不到。
不知道作者有没遇到过这情况
找到个临时解决办法,当PodA采用源码版本,PodB采用二进制版本时,pod install
后去Pods-> PodA
的build settings
中的framework search paths
中加上"${PODS_ROOT}/PodB"
就能编译了。
这块不知道插件能否自动处理下
这种情况下,如果你用到了插件切换二进制、源码,可能会有问题 因为插件目前只能设置一个源码私有源和一个二进制私有源,如果在 bin.yml 里面的源码私有源里面不包含某个组件,而是在外部加的源里面,插件就不知道这个源是源码的还是二进制的了。
我现在遇到个问题,不知道和你说的这个有没有关系。
环境: cocoapods 1.7.5 pod bin init设置的源码私有源地址:git@gitlab.xxx.com:iOS/Specs1.git pod bin init设置的二进制私有源地址:git@gitlab.xxx.com:iOS/BinarySpecs.git Podfile:
# 私有source spec repo 1 source 'git@gitlab.xxx.com:iOS/Specs1.git' # 私有source spec repo 2 source 'git@gitlab.xxx.com:iOS/Specs2.git' # 私有source spec repo 3 source 'git@gitlab.xxx.com:iOS/Specs3.git' # 私有source spec repo 4 source 'git@gitlab.xxx.com:iOS/Specs4.git' install! 'cocoapods', generate_multiple_pod_projects: true, disable_input_output_paths: true, incremental_installation: true plugin 'cocoapods-bin' use_binaries!
有两个Pod, PodA依赖PodB,PodA中用尖括号方式import PodB中头文件:
#import <PodB/PodB.h>
PodA和PodB的spec都在源码私有源 git@gitlab.xxx.com:iOS/Specs1.git 中。
情况一:PodA和PodB都采用源码版本,相应的Podfile:
use_binaries! set_use_source_pods ['PodA', 'PodB']
这种情况可以正常编译
情况二:PodA采用源码版本,PodB采用二进制版本,相应的Podfile:
use_binaries! set_use_source_pods ['PodA']
这种情况无法正常编译,在PodA import PodB头文件的地方报 <PodB/PodB.h> 头文件找不到。
不知道作者有没遇到过这情况
https://github.com/CocoaPods/CocoaPods/issues/8668 这个问题可以看这里,暂时没解决
这里看错了,你遇到的问题和 CocoaPods/CocoaPods#8668 不一样。 PodA 依赖 PodB ,PodB 使用二进制版本,如果 PodB 存在 modulemap 文件,并且文件暴露了 PodB.h 那么 PodA 可以引用 <PodB/PodB.h> 。 插件生成 modulemap 策略沿用了 cocoapods-packager,有三种情况:
#import <PodB/PodB.h>
的时候报错。还有,如果 PodA 依赖了 PodB ,那么生成 PodA.xcconfig 会自动包含你说的那个配置:
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/PodB"
这边的 cocoapods 版本是 1.7.5 ,并没有开启 generate_multiple_pod_projects ,可能和这个也有关系,我遇到这种情况,一般都是原组件的二进制版本 modulemap 未生成,其他的原因暂时没有遇到过
我试了内部工程的 generate_multiple_pod_projects ,打开之后,编译依然没问题
试了一把:
pod install
FRAMEWORK_SEARCH_PATHS
中仍然没有PodB,但是存在那些不由插件管理的静态库依赖对比了下PodA和PodB均采用二进制的情况:
FRAMEWORK_SEARCH_PATHS
中存在PodB,也存在不由插件管理的静态库依赖附上PodA采用源码时的Podfile:
plugin 'cocoapods-bin'
use_binaries!
set_use_source_pods ['PodA']
install! 'cocoapods',
generate_multiple_pod_projects: true,
disable_input_output_paths: true,
incremental_installation: true
感觉在生成PodA.xcconfig的时候把PodB当成源码依赖了,没放入FRAMEWORK_SEARCH_PATHS
中
我这边并没有这个问题,比如我们的 Networking 框架,依赖 AFNetworking,Networking 用源码 ,AFNetworking 用二进制,FRAMEWORK_SEARCH_PATHS
就有依赖的所有 framework
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AFNetworking"
https://github.com/for-example-test/cocoapods-bin-issue-11-import 你可以用这个工程试试看
跑了你的工程,都是OK的。
最后找到问题了,一个低级错误,PodA的源码podspec的依赖里把PodB漏了,所以源码接入PodA时找不到framework B了。
当初在理PodA的依赖时只改了PodA.binary-template.podspec,漏改PodA.podspec了。
非常感谢
另外 CocoaPods/CocoaPods#8668 这个问题我之前也遇到过,我的临时解决办法是打完framework后把里面的Modules文件夹删除,SO上有人也这么做 https://stackoverflow.com/questions/38423565/include-of-non-modular-header-inside-framework-module-error
跑了你的工程,都是OK的。
最后找到问题了,一个低级错误,PodA的源码podspec的依赖里把PodB漏了,所以源码接入PodA时找不到framework B了。
当初在理PodA的依赖时只改了PodA.binary-template.podspec,漏改PodA.podspec了。
非常感谢
跑了你的工程,都是OK的。
最后找到问题了,一个低级错误,PodA的源码podspec的依赖里把PodB漏了,所以源码接入PodA时找不到framework B了。
当初在理PodA的依赖时只改了PodA.binary-template.podspec,漏改PodA.podspec了。
非常感谢
如果 PodA 能把 subspec 铺平是最好的了,直接用插件生成,这样就不用模版 podspec。subspec 这东西,感觉很多时候比较鸡肋,会极大地增加 lint 耗时,即使改其中一个 subspec,还是需要对这个组件的所有 subspec 以及自身走 lint ,我们这边是把原来大部分 subspec 都拆成独立的工程了
另外 CocoaPods/CocoaPods#8668 这个问题我之前也遇到过,我的临时解决办法是打完framework后把里面的Modules文件夹删除,SO上有人也这么做 https://stackoverflow.com/questions/38423565/include-of-non-modular-header-inside-framework-module-error
这么做的话就没有 moudlemap 文件了把,感觉这个文件还是需要的,能避免很多规范性问题
跑了你的工程,都是OK的。 最后找到问题了,一个低级错误,PodA的源码podspec的依赖里把PodB漏了,所以源码接入PodA时找不到framework B了。 当初在理PodA的依赖时只改了PodA.binary-template.podspec,漏改PodA.podspec了。 非常感谢
跑了你的工程,都是OK的。 最后找到问题了,一个低级错误,PodA的源码podspec的依赖里把PodB漏了,所以源码接入PodA时找不到framework B了。 当初在理PodA的依赖时只改了PodA.binary-template.podspec,漏改PodA.podspec了。 非常感谢
如果 PodA 能把 subspec 铺平是最好的了,直接用插件生成,这样就不用模版 podspec。subspec 这东西,感觉很多时候比较鸡肋,会极大地增加 lint 耗时,即使改其中一个 subspec,还是需要对这个组件的所有 subspec 以及自身走 lint ,我们这边是把原来大部分 subspec 都拆成独立的工程了
我们PodA是个基础业务组件,用subspec主要用来切分resource,不同业务部门需要不同的resource就接不同的subspec,避免接入全量resource造成浪费。 代码都是一套,所以我们的情况用subspec应该还好。
我们这有些部门会对外输出一些能力,以单一Pod的形式输出比较方便接入方。这是个大而全的Pod,里面有很多子业务模块,都会频繁更新,都拆成独立Pod的话发版有点太频繁,依赖管理也有点麻烦,权衡下来他们都放一个Pod里,用subspec来切,有点mono repo的意思。然后不同subspec里定义不同的宏,接入方接入自己需要的subspec,其余subspec的代码不会参与编译。估计跟你那边情况不完全一样。
另外 CocoaPods/CocoaPods#8668 这个问题我之前也遇到过,我的临时解决办法是打完framework后把里面的Modules文件夹删除,SO上有人也这么做 https://stackoverflow.com/questions/38423565/include-of-non-modular-header-inside-framework-module-error
这么做的话就没有 moudlemap 文件了把,感觉这个文件还是需要的,能避免很多规范性问题
确实是把modulemap删了。暂时只能先删了,不然编译不过。回头再来查下是不是里面有些隐藏的小问题引起的。
跑了你的工程,都是OK的。 最后找到问题了,一个低级错误,PodA的源码podspec的依赖里把PodB漏了,所以源码接入PodA时找不到framework B了。 当初在理PodA的依赖时只改了PodA.binary-template.podspec,漏改PodA.podspec了。 非常感谢
跑了你的工程,都是OK的。 最后找到问题了,一个低级错误,PodA的源码podspec的依赖里把PodB漏了,所以源码接入PodA时找不到framework B了。 当初在理PodA的依赖时只改了PodA.binary-template.podspec,漏改PodA.podspec了。 非常感谢
如果 PodA 能把 subspec 铺平是最好的了,直接用插件生成,这样就不用模版 podspec。subspec 这东西,感觉很多时候比较鸡肋,会极大地增加 lint 耗时,即使改其中一个 subspec,还是需要对这个组件的所有 subspec 以及自身走 lint ,我们这边是把原来大部分 subspec 都拆成独立的工程了
我们PodA是个基础业务组件,用subspec主要用来切分resource,不同业务部门需要不同的resource就接不同的subspec,避免接入全量resource造成浪费。 代码都是一套,所以我们的情况用subspec应该还好。
我们这有些部门会对外输出一些能力,以单一Pod的形式输出比较方便接入方。这是个大而全的Pod,里面有很多子业务模块,都会频繁更新,都拆成独立Pod的话发版有点太频繁,依赖管理也有点麻烦,权衡下来他们都放一个Pod里,用subspec来切,有点mono repo的意思。然后不同subspec里定义不同的宏,接入方接入自己需要的subspec,其余subspec的代码不会参与编译。估计跟你那边情况不完全一样。
我的意思是这个发布这个大而全的 Pod 很耗时间。我们这边也会有对其他业务组输出业务组件的场景,基本上会创建一个壳组件,这个组件再设置所有输出的组件,外界依赖这个壳组件。好处是,假如我们有三个组件 A,B,C,这次只改了 C ,那么我只发布 C 就可以了,整个 CI 的 pipeline 很短,这对于动则15+个组件的发布来说,还是比较关键的,而且开发时只更改 C 壳工程即可,不用在意 A,B 是否存在并行任务,合并冲突啥的。如果 D/A,D/B,D/C 这种 subspec 的形式,那么改动了 D/C subspec,就需要发布整个 D 组件,假如每个 subspec 的发布时间是 2 min,那么发布 D 组件的时间会 > 8min。
我们另外一个业务线的对外提供方式也是和你们一样,用的 subspec,后面都改成独立组件了。 还有资源的话,你们没有跟着对应的组件走么?除了公用的那部分需要统一放在一个仓库里
跑了你的工程,都是OK的。 最后找到问题了,一个低级错误,PodA的源码podspec的依赖里把PodB漏了,所以源码接入PodA时找不到framework B了。 当初在理PodA的依赖时只改了PodA.binary-template.podspec,漏改PodA.podspec了。 非常感谢
跑了你的工程,都是OK的。 最后找到问题了,一个低级错误,PodA的源码podspec的依赖里把PodB漏了,所以源码接入PodA时找不到framework B了。 当初在理PodA的依赖时只改了PodA.binary-template.podspec,漏改PodA.podspec了。 非常感谢
如果 PodA 能把 subspec 铺平是最好的了,直接用插件生成,这样就不用模版 podspec。subspec 这东西,感觉很多时候比较鸡肋,会极大地增加 lint 耗时,即使改其中一个 subspec,还是需要对这个组件的所有 subspec 以及自身走 lint ,我们这边是把原来大部分 subspec 都拆成独立的工程了
我们PodA是个基础业务组件,用subspec主要用来切分resource,不同业务部门需要不同的resource就接不同的subspec,避免接入全量resource造成浪费。 代码都是一套,所以我们的情况用subspec应该还好。 我们这有些部门会对外输出一些能力,以单一Pod的形式输出比较方便接入方。这是个大而全的Pod,里面有很多子业务模块,都会频繁更新,都拆成独立Pod的话发版有点太频繁,依赖管理也有点麻烦,权衡下来他们都放一个Pod里,用subspec来切,有点mono repo的意思。然后不同subspec里定义不同的宏,接入方接入自己需要的subspec,其余subspec的代码不会参与编译。估计跟你那边情况不完全一样。
我的意思是这个发布这个大而全的 Pod 很耗时间。我们这边也会有对其他业务组输出业务组件的场景,基本上会创建一个壳组件,这个组件再设置所有输出的组件,外界依赖这个壳组件。好处是,假如我们有三个组件 A,B,C,这次只改了 C ,那么我只发布 C 就可以了,整个 CI 的 pipeline 很短,这对于动则15+个组件的发布来说,还是比较关键的,而且开发时只更改 C 壳工程即可,不用在意 A,B 是否存在并行任务,合并冲突啥的。如果 D/A,D/B,D/C 这种 subspec 的形式,那么改动了 D/C subspec,就需要发布整个 D 组件,假如每个 subspec 的发布时间是 2 min,那么发布 D 组件的时间会 > 8min。
我们另外一个业务线的对外提供方式也是和你们一样,用的 subspec,后面都改成独立组件了。 还有资源的话,你们没有跟着对应的组件走么?除了公用的那部分需要统一放在一个仓库里
接入方接入的话是接多个独立组件对吧? 资源的话我们其实是跟着组件走。举个例子吧,我们输出的业务组件X提供一些公共UI样式,还有针对不同接入方的多套皮肤。公共UI样式放X/Core subspec,其他皮肤放不同的subspec X/businessA, XbusinessB, ... 等,都依赖X/Core。接入方A就接 X/businessA 这样。
另外 CocoaPods/CocoaPods#8668 这个问题我之前也遇到过,我的临时解决办法是打完framework后把里面的Modules文件夹删除,SO上有人也这么做 https://stackoverflow.com/questions/38423565/include-of-non-modular-header-inside-framework-module-error
这么做的话就没有 moudlemap 文件了把,感觉这个文件还是需要的,能避免很多规范性问题
确实是把modulemap删了。暂时只能先删了,不然编译不过。回头再来查下是不是里面有些隐藏的小问题引起的。
我试了下如果A依赖B,A用framework,而B是源码的时候,A中import <B/B.h> 会报non-modular header的错误。 用你的sample工程试了下好像也是这样。
ps: 你的sample里面 cocoapods_bin_issue_11_import_PodA.h
中 import了A,似乎应该改成 import B
跑了你的工程,都是OK的。 最后找到问题了,一个低级错误,PodA的源码podspec的依赖里把PodB漏了,所以源码接入PodA时找不到framework B了。 当初在理PodA的依赖时只改了PodA.binary-template.podspec,漏改PodA.podspec了。 非常感谢
跑了你的工程,都是OK的。 最后找到问题了,一个低级错误,PodA的源码podspec的依赖里把PodB漏了,所以源码接入PodA时找不到framework B了。 当初在理PodA的依赖时只改了PodA.binary-template.podspec,漏改PodA.podspec了。 非常感谢
如果 PodA 能把 subspec 铺平是最好的了,直接用插件生成,这样就不用模版 podspec。subspec 这东西,感觉很多时候比较鸡肋,会极大地增加 lint 耗时,即使改其中一个 subspec,还是需要对这个组件的所有 subspec 以及自身走 lint ,我们这边是把原来大部分 subspec 都拆成独立的工程了
我们PodA是个基础业务组件,用subspec主要用来切分resource,不同业务部门需要不同的resource就接不同的subspec,避免接入全量resource造成浪费。 代码都是一套,所以我们的情况用subspec应该还好。 我们这有些部门会对外输出一些能力,以单一Pod的形式输出比较方便接入方。这是个大而全的Pod,里面有很多子业务模块,都会频繁更新,都拆成独立Pod的话发版有点太频繁,依赖管理也有点麻烦,权衡下来他们都放一个Pod里,用subspec来切,有点mono repo的意思。然后不同subspec里定义不同的宏,接入方接入自己需要的subspec,其余subspec的代码不会参与编译。估计跟你那边情况不完全一样。
我的意思是这个发布这个大而全的 Pod 很耗时间。我们这边也会有对其他业务组输出业务组件的场景,基本上会创建一个壳组件,这个组件再设置所有输出的组件,外界依赖这个壳组件。好处是,假如我们有三个组件 A,B,C,这次只改了 C ,那么我只发布 C 就可以了,整个 CI 的 pipeline 很短,这对于动则15+个组件的发布来说,还是比较关键的,而且开发时只更改 C 壳工程即可,不用在意 A,B 是否存在并行任务,合并冲突啥的。如果 D/A,D/B,D/C 这种 subspec 的形式,那么改动了 D/C subspec,就需要发布整个 D 组件,假如每个 subspec 的发布时间是 2 min,那么发布 D 组件的时间会 > 8min。 我们另外一个业务线的对外提供方式也是和你们一样,用的 subspec,后面都改成独立组件了。 还有资源的话,你们没有跟着对应的组件走么?除了公用的那部分需要统一放在一个仓库里
接入方接入的话是接多个独立组件对吧? 资源的话我们其实是跟着组件走。举个例子吧,我们输出的业务组件X提供一些公共UI样式,还有针对不同接入方的多套皮肤。公共UI样式放X/Core subspec,其他皮肤放不同的subspec X/businessA, XbusinessB, ... 等,都依赖X/Core。接入方A就接 X/businessA 这样。
是的,逻辑上接入的是多个独立组件,不过实际是通过一个壳组件间接引入所有依赖的组件。比如我们有表单组件,DataDrivenKit,并且有针对不同列表样式的表单元素,公用可编辑,公用不可编辑,然后有各个业务线专用的表单元素,这些都是放在不同仓库里面以不同的组件,而不是 subspec 接入。原先我们业务线少,没有进行区分,放在了一个大的 ItemComponents 组件里,业务线多了以后也是用 subspec 区分,但是这个组件里的样式越来越多以后, lint 的速度非常非常慢,每次发布这个组件都非常耗时。后面就把这个组件库拆分掉了,纵向拆成核心库,基础 Item 库,编辑库,不可编辑库,以及依赖这些库的各个线 Item 库,各个业务线 Item 库横向拆分(物理+逻辑上的),比如我所在的掌柜组,变更掌柜的 Item 库,只需要发布这个库就行,依赖的基础库都用二进制版本, lint 起来很快,其他业务线就发布他们自己的 Item 库,不影响掌柜的表单 UI 组件。有公用的 Item 就放在一个 CommonItem 库里面,不过这个库会有专人去 review 决定要不要合并
另外 CocoaPods/CocoaPods#8668 这个问题我之前也遇到过,我的临时解决办法是打完framework后把里面的Modules文件夹删除,SO上有人也这么做 https://stackoverflow.com/questions/38423565/include-of-non-modular-header-inside-framework-module-error
这么做的话就没有 moudlemap 文件了把,感觉这个文件还是需要的,能避免很多规范性问题
确实是把modulemap删了。暂时只能先删了,不然编译不过。回头再来查下是不是里面有些隐藏的小问题引起的。
我试了下如果A依赖B,A用framework,而B是源码的时候,A中import <B/B.h> 会报non-modular header的错误。 用你的sample工程试了下好像也是这样。
ps: 你的sample里面
cocoapods_bin_issue_11_import_PodA.h
中 import了A,似乎应该改成 import B
嗯,这个是这样的,如果 A 二进制, B 源码,并且 A 有头文件 #import <B/B.h>
就会报这个错误,cocoapods 给 B 生成的 public header 是 B-umbrella.h ,modulemap 暴露的是这个文件, A 引用应该用 #import <B/B-umbrella.h>
,并且因为 A 是 framework ,Enable Modules 没开,编译器没有把 #import <B/B.h>
替换成 @import B
,所以会出现这个错误。如果把所有的 #import 替换成 @import 就没有这个问题
您好,作者大神,最新版本能支持 archive、lint 、push 支持依赖多个私有源吗?
如果podspec中依赖的pod属于私有spec源,那么在pod bin archive时会报错:
Unable to find a specification for
XXXX
depended upon byYYY
包括
pod bin spec lint
和pod bin repo push
等都有这个问题。能否像cocoapods-packager那样提供
--spec-sources
选项来指定私有源?