优雅得处理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 的基本信息。