使用cordova-node-xcode为.pbxproj添加多目标时遇文件共享报错求助
解决cordova-node-xcode共享文件时的"no parent found"错误
这个错误本质是cordova-node-xcode库在处理已存在的文件引用时,找不到对应BuildPhase的父节点,尤其是多目标共享文件的场景,试试以下几个解决步骤:
复用已存在的文件引用
主应用已经添加过的文件,不要再重复创建新的文件引用,先通过findFileReference查找已有引用,再添加到Widget目标:const fileRef = pbxproj.findFileReference('filename.swift'); if (fileRef) { // 直接将已有引用添加到Widget目标 pbxproj.addSourceFile('filename.swift', { target: widgetTargetId }); } else { // 文件未存在时再创建新引用并添加到主应用+Widget pbxproj.addSourceFile('filename.swift', { target: mainTargetId }); pbxproj.addSourceFile('filename.swift', { target: widgetTargetId }); }明确指定目标的SourcesBuildPhase
错误提示找不到SourcesBuildPhase的父节点,大概率是库自动查找Phase时出错,手动获取目标对应的SourcesBuildPhase ID并传入:// 获取Widget目标的SourcesBuildPhase对象 const widgetPhases = pbxproj.pbxSourcesBuildPhaseSection(); const widgetSourcesPhase = Object.values(widgetPhases).find(phase => phase.target === widgetTargetId); if (widgetSourcesPhase) { pbxproj.addSourceFile('filename.swift', { target: widgetTargetId, phase: widgetSourcesPhase.id }); }检查并避免重复添加到同一Phase
先确认文件是否已经在Widget目标的SourcesBuildPhase中,避免重复操作触发错误:const fileRef = pbxproj.findFileReference('filename.swift'); const widgetSourcesPhase = Object.values(pbxproj.pbxSourcesBuildPhaseSection()).find(phase => phase.target === widgetTargetId); const isFileAdded = widgetSourcesPhase.files.some(file => file.fileRef === fileRef.id); if (!isFileAdded) { pbxproj.addToPbxBuildPhase(fileRef.id, widgetSourcesPhase.id, 'PBXSourcesBuildPhase'); }手动关联文件与BuildPhase
如果addSourceFile方法的自动逻辑有问题,直接用底层的addToPbxBuildPhase方法手动建立关联,绕开库的自动查找逻辑:const fileRef = pbxproj.findFileReference('filename.swift'); const widgetSourcesPhaseId = Object.keys(pbxproj.pbxSourcesBuildPhaseSection()).find(key => pbxproj.pbxSourcesBuildPhaseSection()[key].target === widgetTargetId ); pbxproj.addToPbxBuildPhase(fileRef.id, widgetSourcesPhaseId, 'PBXSourcesBuildPhase');
内容的提问来源于stack exchange,提问作者Larry Singh
相关产品推荐
相关产品推荐

