В этом туториале я покажу вам, как использовать 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. ?
