Xcode 14把原來(lái)的Legacy Build System干掉了拓提,默認(rèn)用新的New Build System等限。
或者Xcode 14以下屋彪,工程直接使用的New Build System鹉胖。
此文章用來(lái)記錄自己遇到的問(wèn)題握玛。如有錯(cuò)誤感謝指證够傍。
一、pods中的resource bundles要指定team
在podfile文件中指定team(需要指定Team ID挠铲,這么配置在某些工程可能不適用冕屯,可臨時(shí)解決問(wèn)題)
post_install do |installer|
installer.pods_project.build_configurations.each do |config|
config.build_settings['CODE_SIGN_IDENTITY'] = "Team ID";
config.build_settings['CODE_SIGN_IDENTITY[sdk=*]'] = "Team ID";
end
end
或者
def fix_config(config)
if config.build_settings['DEVELOPMENT_TEAM'].nil?
config.build_settings['DEVELOPMENT_TEAM'] = 'Team ID'
end
end
post_install do |installer|
installer.generated_projects.each do |project|
project.build_configurations.each do |config|
fix_config(config)
end
project.targets.each do |target|
target.build_configurations.each do |config|
fix_config(config)
end
end
end
end
二、pods執(zhí)行腳本assets.car重復(fù)
這種錯(cuò)誤一般出現(xiàn)在自己的私有庫(kù)中拂苹,且?guī)焓庆o態(tài)庫(kù)(動(dòng)態(tài)庫(kù)不會(huì)有這個(gè)問(wèn)題)安聘,podspec文件中使用resources
管理資源文件,未使用resource_bundles
瓢棒,就會(huì)導(dǎo)致在New Build System下報(bào)錯(cuò)“Multiple commands produce
”浴韭。因?yàn)閜ods在執(zhí)行腳本過(guò)程中,會(huì)將xcassets打包成assets.car脯宿,庫(kù)中有xcassets文件念颈,主工程中也有xcassets文件,會(huì)將這些assets.car都拷貝到app包的根目錄下连霉,自然文件沖突榴芳。解決方式是調(diào)整一下資源文件管理方式(見(jiàn)方法二)。
- 方法一:設(shè)置disable_input_output_paths => true可解決assets.car和重復(fù)的資源文件問(wèn)題跺撼,但可能會(huì)有其他問(wèn)題和減慢編譯速度窟感。
- 方法二:將庫(kù)的podspec文件中resources改為resource_bundles(xcassets),相應(yīng)的資源文件獲取方式也需要修改财边。(bundle肌括、xib是否放到resource_bundles中,自行決定酣难。如果多個(gè)庫(kù)/工程存在同名bundle谍夭、xib的文件,可加入到resource_bundles中憨募,起到類(lèi)似命名空間的作用紧索。)
# spec.resources = [
# 'Resources/**/*.xib',
# 'Resources/**/*.bundle',
# 'Resources/**/*.xcassets'
# ]
# 使用spec.name作為bundle文件的文件名
spec.resource_bundles = {spec.name => [
'Resources/**/*.xib',
'Resources/**/*.bundle',
'Resources/**/*.xcassets'
]}
/// 獲取對(duì)應(yīng)Bundle路徑 ,在庫(kù)中任意類(lèi)中使用self都可以
/// 使用bundleForClass同時(shí)兼容動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)菜谣。如果在靜態(tài)庫(kù)中珠漂,會(huì)返回mainBundle,如果在動(dòng)態(tài)庫(kù)中尾膊,會(huì)返回庫(kù)本身路徑媳危。
//使用了resource_bundles的方式管理資源(動(dòng)態(tài)庫(kù)/靜態(tài)庫(kù))
NSBundle *mainBundle = [NSBundle bundleForClass:self.class];
NSString *path = [mainBundle pathForResource:@"Resources" ofType:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:path];
//使用了resources的方式管理資源(動(dòng)態(tài)庫(kù))
//NSBundle *bundle = [NSBundle bundleForClass:self.class];
UIViewController *vc = [[super alloc] initWithNibName:@"UIViewController" bundle:bundle];
UIImage *image = [UIImage imageNamed:@"imageName" inBundle:bundle compatibleWithTraitCollection:nil];
三、直接放在項(xiàng)目中的多個(gè)同名資源文件報(bào)錯(cuò)
- 方法一:設(shè)置disable_input_output_paths => true可解決assets.car和重復(fù)的資源文件問(wèn)題冈敛,但可能會(huì)有其他問(wèn)題和減慢編譯速度待笑。
- 方法二:比如存在Test1/a.png和Test2/a.png會(huì)報(bào)錯(cuò)。如果是在同一個(gè)工程里抓谴,相同保留一份就好暮蹂,如果不同修改文件名寞缝。如果是私有庫(kù),使用
resources
方式管理資源文件仰泻,也會(huì)和其他私有庫(kù)/工程中同名文件沖突荆陆,這時(shí)建議使用resource_bundles
方式管理(具體在上文第二點(diǎn))。因?yàn)橘Y源文件會(huì)直接打包進(jìn)工程app文件根目錄下集侯,所以多個(gè)同名文件在New Build System下會(huì)報(bào)錯(cuò)“Multiple commands produce
”的錯(cuò)被啼。