You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Xcode中聚合目标输出文件夹的引用在Debug/Release构建间失效的配置问题求助

Xcode中聚合目标输出文件夹的引用在Debug/Release构建间失效的配置问题求助

各位Xcode老司机们,我最近在配置项目时遇到了一个头疼的路径适配问题,折腾了好几天都没找到完美解决办法,想请教下大家有没有更优雅的方案。

我的场景背景

我有一个主目标BrowserApp,同时做了一个聚合目标WebBundle,用来跑脚本生成包含HTML/CSS/静态资源的web bundle,输出到build/文件夹里。因为多个目标都要用到这个web bundle,所以想用聚合目标统一生成,避免重复配置。

第一步踩坑:跨目标的路径引用问题

我把聚合目标的输出目录设为$(DERIVED_FILE_DIR)/,生成的资源路径大概是这样的:

DerivedData/BrowserApp-bla/Build/Intermediates.noindex/BrowserApp.build/Debug-iphonesimulator/WebBundle.build/DerivedSources/build/index.html

然后我把这个build/文件夹拖进Xcode,Xcode 16自动生成了PBXFileSystemSynchronizedRootGroup,但它的相对路径是基于主目标的BUILT_PRODUCTS_DIR(主目标的产物目录是DerivedData/BrowserApp-bla/Build/Products/Debug-iphonesimulator),所以生成的配置是这样的:

A9DE6A502E41E397005EF4E0 /* build */ = { 
  isa = PBXFileSystemSynchronizedRootGroup; 
  name = build; 
  path = "../../Intermediates.noindex/BrowserApp.build/Debug-iphonesimulator/WebBundle.build/DerivedSources/build"; 
  sourceTree = BUILT_PRODUCTS_DIR; 
};

这个路径相当于要从主目标的产物目录跳出去,进到聚合目标的Intermediates目录里,Debug模式下凑合用,但明眼人都能看出来,切换到Release构建或者Archive的时候,这个硬编码了Debug-iphonesimulator的路径肯定直接失效。

第二步:资源复制的额外问题

就算先不管Debug/Release适配的问题,把这个文件夹加到Copy Bundle Resources里又成了难题——Xcode 16的PBXFileSystemSynchronizedRootGroup虽然好用,但没法直接加到资源复制阶段里。我最后只能用两种办法绕过去:

  • 降级到旧版Xcode操作
  • 手动修改project.pbxproj文件,具体操作是:
    1. PBXFileSystemSynchronizedRootGroup改成PBXFileReference
      A9DE6A502E41E397005EF4E0 /* ../../Intermediates.noindex/client.build/Debug/WebBundle.build/DerivedSources/build */ = {
        isa = PBXFileReference; 
        lastKnownFileType = text; 
        path = ../../Intermediates.noindex/BrowserApp.build/Debug-iphonesimulator/WebBundle.build/DerivedSources/build; 
        sourceTree = BUILT_PRODUCTS_DIR; 
      };
      
    2. 把这个引用加到主Group里
    3. 新建PBXBuildFile关联这个FileReference,再加到主目标的Copy Bundle Resources阶段:
      96516AC32BF928DD00576562 /* ../../Intermediates.noindex/BrowserApp.build/Debug-iphonesimulator/WebBundle.build/DerivedSources/build in Resources */ = {
        isa = PBXBuildFile; 
        fileRef = A9DE6A502E41E397005EF4E0 /* ../../Intermediates.noindex/BrowserApp.build/Debug-iphonesimulator/WebBundle.build/DerivedSources/build */; 
      };
      

改完之后Debug模式下确实能正常把整个文件夹复制到app包里,但一切换到Release构建或者Archive,就直接报找不到路径的错误:

lstat(/Users/calebkierum/Library/Developer/Xcode/DerivedData/BrowserApp-bla/Build/Intermediates.noindex/ArchiveIntermediates/BrowserApp/Intermediates.noindex/BrowserApp.build/Debug-iphonesimulator/WebBundle.build/DerivedSources/build): No such file or directory (2)

原因也很明显,路径里硬编码了Debug-iphonesimulator,Release/Archive时路径完全对不上。

核心疑问

我想请教大家:有没有办法让这个web bundle的文件引用路径能自动适配不同的构建配置(Debug/Release/Archive),不需要手动修改相对路径?同时能正常被Xcode的Copy Bundle Resources阶段识别并复制,最好不用降级Xcode或者手动改pbxproj文件?

谢谢各位的指点了!

火山引擎 最新活动