В этом туториале я покажу вам, как использовать Makefiles для серверных проектов Swift, чтобы помочь упростить выполнение служебных задач.
Make — это программное обеспечение для автоматизации сборки, которое можно использовать для автоматического выполнения различных команд. Если вы хотите что-то запустить, вам нужно указать свои команды (точнее: цели сборки) через Makefiles. В этом кратком туториале я покажу вам некоторые из моих лучших приемов для проектов на Swift. 😉
Как правило я создаю Makefile для своих серверных проектов на Swift и указываю в нем одни из наиболее часто используемых команд из Swift Package Manager.
build:
swift build
update:
swift package update
release:
swift build -c release
test:
swift test --parallel
clean:
rm -rf .build
Например , таким образом я могу легко запустить команду make release, чтобы создать релизную версию моего пакета Swift. Обычно я заканчиваю тем, что добавляю в Makefile еще более сложные команды, другой типичный сценарий — когда у пакета есть исполняемая цель. Как правило, я создаю команды install и uninstall, чтобы в определенном месте быстро установить или удалить двоичный продукт. 🏗️
install: release
install ./.build/release/my-app /usr/local/bin/my-app
uninstall:
rm /usr/local/bin/my-app
Как вы, возможно, знаете, в настоящее время я в основном создаю приложения на основе Vapor (или Hummingbird, - заслуживает отдельного поста), поэтому очень удобно иметь внутри моего Makefile набор команд, предназначенный для управления состоянием серверного приложения. 💧
start:
my-app serve --port 8080 &
stop:
@lsof -i :8080 -sTCP:LISTEN | awk 'NR > 1 {print $$2}' | xargs kill -15
restart: stop start
reset: stop
rm -f ./Resources/db.sqlite
При использовании & в конце команды start, сервер будет работать в фоновом режиме, а использование символа @ перед командой lsof “заглушит” вывод команды make (по умолчанию команда make также будет отображать ваши команды) .
Поскольку все должно работать и под Linux тоже, я часто использую Docker для запуска приложения в контейнере. У меня есть шпаргалка по Docker, но я тоже ленивый разработчик, поэтому я сделал несколько вспомогательных команд в Makefile.
#
# Dockerfile:
# ----------------------------------------
#
# FROM swift:5.7-amazonlinux2
#
# WORKDIR /my-app
#
# ----------------------------------------
#
docker-build-image:
docker build -t my-app-image .
docker-run:
docker run --name my-app-instance \
-v $(PWD):/my-app \
-w /my-app \
-e "PS1=\u@\w: " \
-it my-app-image \
--rm
Сначала вам нужно смонтировать образ для приложения Swift, для этого рядом с Makefile вам также нужно создать Dockerfile, только потом вы сможете создать из него одно(-*разовый) экземпляр docker с помощью команды make docker-run. 🐳
Есть еще два тематических раздела, о которых я хотел бы поговорить. Первый связан с формированием зоны покрытия кода для приложений на основе Swift package manager. Чтобы поддерживать это, в моем Makefile есть:
test-with-coverage:
swift test --parallel --enable-code-coverage
#
# Install dependencies (on macOS):
# ----------------------------------------
# brew install llvm
# echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> ~/.zshrc
# ----------------------------------------
#
code-coverage: test-with-coverage
llvm-cov report \
.build/x86_64-apple-macosx/debug/myAppPackageTests.xctest/Contents/MacOS/myAppPackageTests \
-instr-profile=.build/x86_64-apple-macosx/debug/codecov/default.profdata \
-ignore-filename-regex=".build|Tests" \
-use-color
Вы можете легко сформировать данные о зоне покрытия кода, запустив команду make code-coverage. Если есть желание узнать больше о деталях, лежащих в основе, пожалуйста, обращайтесь к прикрепленной статье.
Последней затронем документацию. Apple выпустила DocC для Swift довольно давно, и, кажется, что теперь многие используют его. Поначалу я не был большим фанатом DocC, но теперь - да. Можно упростить процесс формирования doc-файла с помощью Makefiles, и я довольно часто прибегаю к команде make docs-preview, чтобы подглядеть в API. 🔨
docs-preview:
swift package --disable-sandbox preview-documentation --target MyLibrary
docs-generate:
swift package generate-documentation \
--target MyLibrary
docs-generate-static:
swift package --disable-sandbox \
generate-documentation \
--transform-for-static-hosting \
--hosting-base-path "MyLibrary" \
--target MyLibrary \
--output-path ./docs
Конечно, вы можете добавить больше целей в свой Makefile, чтобы автоматизировать рабочий процесс по мере необходимости. Здесь всего лишь несколько распространенных приемов, которые я сейчас использую для своих серверных проектов Swift. Разработчики iOS также могут воспользоваться преимуществами Makefiles, есть несколько довольно длинных команд, связанных с xcodebuild, которые можно значительно упростить с помощью Makefile. 💪