xcode 警告构建:运行脚本生成阶段'Module'将在每次生成期间运行,因为它未指定任何输出若要解决此警告

gmol1639  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(453)

我的工作区中集成了几个框架/模块,但出现了错误。
警告构建:运行脚本生成阶段“模块名称”将在每次生成期间运行,因为它未指定任何输出。若要解决此警告,请向脚本阶段添加输出依赖项,或者通过取消选中脚本阶段中的“基于依赖项分析”将其配置为在每次生成期间运行。
我正在寻找如何解决这个问题的解决方案。
若要解决这个警告...或在指令码阶段取消核取[根据相依性分析],将它设定为在每个组建中执行。
我不想使用上面描述的解决方案,因为这将花费我的构建时间。我宁愿知道如何做下面:
...将输出依赖项添加到脚本阶段
很遗憾我没有足够的知识去做这件事。我在网上搜索了一下,没有找到任何具体的东西。
如何输出这些依赖关系?谢谢

hgqdbh6s

hgqdbh6s1#

请参阅script phase documentation以了解详细信息,尤其是 “为脚本指定输入和输出文件” 部分。您需要编辑构建阶段,并指定脚本将使用哪些文件作为输入(如果有)以及将生成哪些文件。
使用此信息,Xcode构建过程可以确定是否需要运行脚本阶段:如果输入文件没有改变,就根本不需要运行脚本阶段;如果运行了脚本阶段,Xcode至少知道生成了哪些输出文件,从而知道需要运行哪些依赖于这些文件的构建过程。
另请参阅Improving the Speed of Incremental Builds中的 “为自定义脚本和构建规则声明输入和输出” 部分

z31licg0

z31licg02#

如果你正在使用CocoaPods,你的警告大多来自它。我想出了两个临时的解决方案,通过修改Pod文件。一个永久的解决方案需要直接在CocoaPods本身修复这个问题。对于不是由CocoaPods生成的自定义运行脚本,只需取消选中“基于依存关系分析”,向Xcode表明您有意不使用输入/输出文件以确定是否应运行此脚本。
当需要的时候,在任何给定的项目〈=〉目标对上,两者都将always_out_of_date(也称为“Based on dependency analysis”)标志设置为true("1")。

溶液A:在post_integrate挂接中完成所有操作

优点:单模块、紧凑型解决方案
缺点:在运行pod install时,性能不如解决方案B,但老实说,这是不可察觉的。

# Fix Xcode 14 warnings like:
# warning: Run script build phase '[CP] Copy XCFrameworks' will be run during every build because it does not specify any outputs. To address this warning, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'ATargetNameHere' from project 'YourProjectName')
# Ref.: https://github.com/CocoaPods/CocoaPods/issues/11444
post_integrate do |installer|
  main_project = installer.aggregate_targets[0].user_project
  pods_project = installer.pods_project
  targets = main_project.targets + pods_project.targets
  targets.each do |target|
    run_script_build_phases = target.build_phases.filter { |phase| phase.is_a?(Xcodeproj::Project::Object::PBXShellScriptBuildPhase) }
    cocoapods_run_script_build_phases = run_script_build_phases.filter { |phase| phase.name.start_with?("[CP]") }
    cocoapods_run_script_build_phases.each do |run_script|
      next unless (run_script.input_paths || []).empty? && (run_script.output_paths || []).empty?
      run_script.always_out_of_date = "1"
    end
  end
  main_project.save
  pods_project.save
end

溶液B:除了修改post_install挂接中的pods_project以获得稍好的性能之外,与A相同

优点:技术上比解决方案A性能更高,因为它节省了一次昂贵的xcodeproj.save调用
缺点:解决方案更分散在你的Podfile中。

# Fix Xcode 14 warnings like:
# warning: Run script build phase '[CP] Copy XCFrameworks' will be run during every build because it does not specify any outputs. To address this warning, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'ATargetNameHere' from project 'YourProjectName')
# Ref.: https://github.com/CocoaPods/CocoaPods/issues/11444
def set_run_script_to_always_run_when_no_input_or_output_files_exist(project:)
  project.targets.each do |target|
    run_script_build_phases = target.build_phases.filter { |phase| phase.is_a?(Xcodeproj::Project::Object::PBXShellScriptBuildPhase) }
    cocoapods_run_script_build_phases = run_script_build_phases.filter { |phase| phase.name.start_with?("[CP]") }
    cocoapods_run_script_build_phases.each do |run_script|
      next unless (run_script.input_paths || []).empty? && (run_script.output_paths || []).empty?
      run_script.always_out_of_date = "1"
    end
  end
  project.save
end

post_integrate do |installer|
  main_project = installer.aggregate_targets[0].user_project
  set_run_script_to_always_run_when_no_input_or_output_files_exist(project: main_project)
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    # Projects usually do stuff in here…
  end
  set_run_script_to_always_run_when_no_input_or_output_files_exist(project: installer.pods_project)
end

运行pod install后,如果xcodeproj文件存储在git中,请提交对主xcodeproj所做的更改。

相关问题