优雅得处理Xcode项目中的TODO、FIXME
背景
在开发过程中,我们都会不时地写一些 // TODO:
和 // FIXME:
注释。有时我们这样做是因为我们知道代码可以做得更好,但暂时不确定如何做,有时由于 deadline 而没有时间编写最佳解决方案,而有时我们只是想着手处理更有趣的事情,这时我们只需在代码中标识一个 // TODO:
以便在将来某一天再处理。
痛点
Xcode 默认无法自动识别这些标记,因为编辑器没有给我们强提示,所以即使有时我们立了 flag 过后也很容易忘记去实现,如下面情况所示:
解决办法
利用 Xcode 工程设置 Build Phases
在 build 时执行自定义任务,点击 Build Phases
下 + 号,点击 New Run Script Phase
,填入内容:
KEYWORDS="STUB:|TODO:|FIXME:|DevTeam:|\?\?\?:"
find "${SRCROOT}" \( -name "*.h" -or -name "*.m" -or -name "*.swift" \) -not -path "${SRCROOT}/Pods/*" -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($KEYWORDS).*\$" | perl -p -e "s/($KEYWORDS)/1: warning: \$1/"
KEYWORDS="ERROR:|XXX:|\!\!\!:"
find "${SRCROOT}" \( -name "*.h" -or -name "*.m" -or -name "*.swift" \) -not -path "${SRCROOT}/Pods/*" -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($KEYWORDS).*\$" | perl -p -e "s/($KEYWORDS)/1: error: \$1/"
ERROR_OUTPUT=`find "${SRCROOT}" \( -name "*.h" -or -name "*.m" -or -name "*.swift" \) -not -path "${SRCROOT}/Pods/*" -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($KEYWORDS).*\$" | perl -p -e "s/($KEYWORDS)/1: error: \$1/"`
exit ${#ERROR_OUTPUT}
效果
这时我们再看看效果,是不是友好多了。
建议
在 TODO 等这些标记处中加上日期和作者,虽然 git 能够追溯,但是这样更直接,也就多占用几秒的时间。这使您和团队中的每个人都非常清楚 TODO 待了多长时间,以及是谁写的。目的不是追责,而是要问作者该待办事项是否仍然需要处理,以及在您使用的任何系统中是否有其它方式来跟踪必须完成的工作。
也可以从 git 中提取 TODO 的作者和日期,但这有时可能会出现问题,尤其是在移动了有 TODO 标记的代码的情况下,因为 TODO 将包含整个历史记录。一目了然,可以轻松获得有关 TODO 的基本信息。