仅为 Xcode 4 中的“存档”构建运行脚本
Posted
技术标签:
【中文标题】仅为 Xcode 4 中的“存档”构建运行脚本【英文标题】:Running script only for an 'Archive' build in Xcode 4 【发布时间】:2011-07-25 04:35:27 【问题描述】:我有一个脚本,我使用 Xcode 4 中的运行脚本构建阶段中的 osascript 运行该脚本。该脚本会进行一些检查以尝试捕获 plist 等中的任何人为错误。
但是,我真的只想在开发人员选择“存档”时运行此脚本,而不是在每次构建时都运行它。
有什么方法可以测试这种情况吗?使用 Shell 脚本还是 Apple 脚本?
【问题讨论】:
【参考方案1】:在 Xcode 4+ 中,您可以将此脚本作为“存档”操作的前置或后置脚本运行。但是,操作前和操作后脚本不被视为构建本身的一部分;它们的输出不是构建日志的一部分,失败的脚本不会导致构建失败。
如果您想将此脚本作为构建的一流部分包括在内,这样它的失败将导致构建失败,那么您将想做其他事情。创建一个新的“外部构建系统”目标,并将其配置为运行您的脚本。脚本的路径可以是相对路径,相对于项目根目录。
最后,打开您的主项目方案,并在“构建”标签中添加新的检查器目标,并将其设置为仅包含在“存档”操作中。这应该会导致您的检查器脚本仅在选择“存档”时作为构建的一部分运行,并且如果脚本返回非零值,则构建将失败。
以下是配置 bash 脚本以仅在归档目标时运行的分步可视化指南:
文件>新建>目标>其他>外部构建系统
相应地命名产品并将/bin/bash
设置为构建工具
在 Info > Arguments 下提供脚本的路径新创建的目标
Product > Scheme > Edit Scheme...,并在归档之前编辑您希望此脚本运行的目标的方案。在 Build 下,添加您在步骤 1 中添加的 External Build System 目标。如果需要,重新排序。然后取消选中除存档之外的所有内容。
【讨论】:
可爱。在发布问题几天后,我确实找到了前/后操作。虽然从来没有尝试过。为细节干杯。 需要注意的一点:当你设置一个新的“外部构建系统”目标时,一定要进入它的依赖关系并将它设置为依赖于你的另一个目标——否则它可以运行在另一个目标完成构建之前。 对于那些想要更简单的方法的人,您可以检查脚本中的$CONFIGURATION
变量,例如:config="Release" if [ "$config" = "$CONFIGURATION" ]; then echo "Running my script" fi
假设您从未在发布模式下运行任何其他操作。分析(至少为了性能)通常也是在发布模式下完成的,所以你也会在那里运行这个脚本。
我的用例是更新构建版本号,Xcode 在运行任何自定义脚本操作之前处理 Info.plist 文件。但是,首先处理依赖的构建目标。这也比 Scheme 脚本操作好得多,因为它们几乎没有设置任何有用的环境变量。【参考方案2】:
-
将“新运行脚本阶段”添加到项目的“构建阶段”
将脚本移动(拖放)到正确的位置
勾选“仅在安装时运行脚本”
如果您不执行 3.,脚本将一直运行,但如果您选中该框,它只会在存档时运行。
【讨论】:
一直在尝试为 Firebase 符号上传解决这个问题,这对 XCode 9 非常有用 - 谢谢! 很高兴它有帮助!【参考方案3】:在我自己的系统上进行的快速测试表明,直接“构建”和“构建和存档”之间的详细脚本输出没有区别。
此外,您无法测试存档的存在(或不存在),因为它只会在进程结束时创建,此时所有脚本都已运行。
据我所知,Xcode 3 中目前没有执行此操作的选项。也许向 Apple 提出改进请求?
当您等待 Apple 时,我能提供的唯一解决方案是使用 xcodebuild 和 xcrun 作为命令行 shell 脚本的一部分,您会知道您是否正在归档。这不是停留在 Xcode 中的解决方案,但它确实具有很大的灵活性。
Xcode "Build and Archive" from command line
【讨论】:
以上是关于仅为 Xcode 4 中的“存档”构建运行脚本的主要内容,如果未能解决你的问题,请参考以下文章