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

Комментарии (0)