Этот пост является вольным переводом статьи How to highlight your TODOs, FIXMEs, & ERRORs in Xcode by Hector Matos
Это был самый обычный день: я писал код, устранял баги и вообще все было прекрасно. Именно тогда я написал блок кода, к которому нужно было вернуться позже. Это обычный случай, с которым вы тоже вероятно сталкивались: нужно было взаимодействовать с API который еще не был готов. Я знал общую структуру объекта, который получу по API, но я еще не мог протестировать работу с ним. Как и любой другой разработчик, я написал комментарий, который выглядит так:
В этот момент я хотел бы создать предупреждение в Xcode, такое же как мы привыкли делать в Objective-C с помощью директив компилятора:
Но увы, так не получилось и я загрустил.
Как человек действия, я сделал то, что и следовало: я действовал. Оказывается вы можете добавить run-скрипт, чтоб получить необходимый функционал.
RUN SCRIPT BUILD PHASES
Xcode поддерживает внутренние bash-команды или скрипты в различных фазах вашего цикла разработки. Вы можете запустить bash-скрипт в любое время до или после сборки, запуска, тестирования, профилирования, анализа или даже архивирования!
Чтобы сделать это, перейдите в "Build Phases" своего проекта в Xcode, нажмите на "+" слева вверху и затем из выпадающего меню выберите "New Run Script Phase":
Затем вы увидите новый раздел в котором можете написать bash-скрипт. Если вы уже эксперт по написанию Swift-скриптов после прочтения поста scripting in swift, вы можете просто положить файл со скриптом в корневой каталог проекта и вызвать его из своего нового run-скрипта.
# Отмечаем ваши TODO, FIXME и ERROR с помощью "родных" предупреждений Xcode
В тело вашего run-скрипта поместите вот этот замечательный код:
TAGS="TODO:|FIXME:"
find "${SRCROOT}" \( -name "*.h" -or -name "*.m" -or -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"
С этого момента вы будете видеть предупреждения когда поставите метку TODO: или FIXME: в комментарии! Посмотрите как работает эта магия:
Не будем останавливаться на достигнутом и исправим скрипт таким образом, чтобы подсвечивать ошибки используя //ERROR: в комментариях. Как вы знаете, бывают ситуации, когда мы хотим обратить особое внимание, выделив ошибку с помощью //ERROR:. Чтобы сделать это, измените ваш bash-скрипт вот так:
TAGS="TODO:|FIXME:"
ERRORTAG="ERROR:"
find "${SRCROOT}" \( -name "*.h" -or -name "*.m" -or -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$|($ERRORTAG).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/" | perl -p -e "s/($ERRORTAG)/ error: \$1/"
Не знаю как вы, но я, наверное — самый забывчивый человек в мире. В конце дня у меня не всегда закончен текущий фрагмент кода и мне нравится использовать //ERROR: чтобы напомнить самому себе над чем работать завтра.
Когда моя IDE выглядит так, я сразу чувствую, что необходимо закончить уже начатое. И не переживайте, ошибки генерируемые этим скриптом не препятствуют сборке проекта.
ЗАКЛЮЧЕНИЕ
В своей повседневной работе вы всегда столкнетесь с блоком кода, к которому нужно будет вернуться позже, но сейчас вы вынуждены поставить "заплатку" и двигаться дальше. К сожалению, даже простого //TODO:, //FIXME: или //ERROR: в комментарии, просто недостаточно. Вы удивитесь сколько людей забывают о своих //TODO:, //FIXME: и //ERROR: в проекте. Использование run-скрипта в этой ситуации — отличный способ, чтобы убедиться, что не упустите ничего в своем цикле разработки. Надеюсь это поможет!
Счастливого кодинга, товарищи ботаники!
П.С. Из комментариев к оригинальному посту извлечена еще одна модификация скрипта, на случай если вам все-таки нужно препятствовать сборке проекта при наличии пометок //ERROR: в коде:
TAGS="TODO:|FIXME:"
ERRORTAG="ERROR:"
OUTPUT=$(find "${SRCROOT}" \( -name "*.h" -or -name "*.m" -or -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$|($ERRORTAG).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/" | perl -p -e "s/($ERRORTAG)/ error: \$1/")
ECHO "$OUTPUT"
if [[ $OUTPUT == *" error: "* ]]
then
exit 1
fi
Комментарии (4)
InstaRobot
29.07.2016 12:34Ну а что? Достаточно удобно! С учетом того, что скоро Alcatraz прикажет долго жить и мы не поставим привычных сторонних плагинов. Вернее не совсем удачно выразился… Скоро вообще все сторонние плагины загнутся! Или самим писать расширения для IDE, или вот такие скриптики привыкать пользовать!
kstep
Зачем здесь поднимать тяжёлый перл, если sed-а хватит за глаза?
s_suhanov
Ну за что купил за то и продаю. У меня на 6-летнем макбуке отрабатывает мгновенно. :)