有没有办法将Interface Builder 冲突约束错误传播到构建过程的其余部分并将其视为构建错误?
当然,LLVM设置Treat Warnings as Errors
对Storyboard错误没有影响。
我有这个观点,显然不能满足所有约束:
在Interface Builder中:
这些错误看起来像这样:
冲突的制约因素
无法满足所有约束条件。
在Xcode项目中:
错误被降级为警告,以便应用程序编译,构建,链接和运行。
如果界面生成器中的故事板中出现AutoLayout错误,如何阻止应用程序构建?
答案 0 :(得分:1)
如果不是一个完整的解决方案,可以采取一些途径进行调查。
首先,请注意自动布局错误/警告有两个主要来源 - unsatisfiable constraints和ambiguous constraints - 并且它们会以不同方式处理。
另请注意,自动布局的全部功能只能在运行时执行 - Xcode的工具可以深入了解故事板中约束的内容,但这与在这些约束中评估这些约束的情况有所不同。在应用程序中运行的“真实”视图/窗口。 (引用中的“真实”因为iOS模拟器适合布局调试......它不一定是真正的设备。)
ibtool
当Xcode“编译”您的故事板作为构建项目的一部分时,它会将该功能委托给命令行程序ibtool
。虽然似乎没有办法改变Xcode解释ibtool
输出的方式(即,将ibtool
输出的错误视为停止构建的原因),但您可以调用{{1你自己多加一点时间。
ibtool
来处理您的故事板。通过ibtool
或--warning
获取警告或错误输出。 (查看正常构建的构建日志,和/或--error
以查看您可能需要的其他标志。)man ibtool
您的shell脚本具有非零状态代码,并且Xcode将停止建立。如上所述,当您的应用运行时,实际的约束测试是在真实的布局情况下。因此,捕捉约束问题的最佳时机可能不是 build 自动化的一部分,而是测试自动化。
对于不明确的布局,您可以使用exit
上的hasAmbiguousLayout
属性在运行时轻松检测到事物。如果你有一个布尔属性,你可以在运行时查询,你可以将一些东西放到自动化测试中。只需编写一些通过应用程序UI运行的单元测试,对重要视图进行测试UIView
,并在该属性为真时失败。然后你的持续集成系统可以告诉你每当有人进行仍然构建的提交时,但会破坏提交后的单元测试。
对于不满意的布局,可能会有点棘手。 Auto Layout系统在检测到此类问题时会自动登录到控制台,因此您可以为CI系统编写一个脚本,该脚本在单元测试的运行日志中查找“无法同时满足约束”。或者......我不确定在通过CI执行测试时是否可以使用特定的Xcode调试器断点运行,但如果是,则可以在hasAmbiguousLayout
上设置符号断点。
答案 1 :(得分:0)
⚠️免责声明:以下解决方案不再适用于Xcode 9.2。
使用ibtool
根据@rickster:
的建议提出运行脚本阶段for FILE in `find ${SRCROOT} -name *.storyboard`
do
IBERROR="`ibtool --errors --warnings --notices --output-format human-readable-text --enable-auto-layout --update-frames $FILE`"
if [ -n "$IBERROR" ]; then
echo "${IBERROR}"
exit 1
fi
done
exit 0
将以上脚本添加到 Build Phases 部分。