Using Makefiles for Swift tasks


Make) is a construct automation software program that you should use to routinely run numerous instructions. If you wish to run one thing, it’s a must to specify your instructions (extra exactly: construct targets) by way of Makefiles. On this fast tutorial I am going to present you a few of my greatest practices for Swift tasks. 😉

Often I create a Makefile for my server-side Swift tasks and place a number of the most used Swift Bundle Supervisor instructions there.

# My Makefile - for server aspect Swift tasks

construct:
    swift construct

replace: 
    swift package deal replace

launch:
    swift construct -c launch
    
take a look at:
    swift take a look at --parallel

clear:
    rm -rf .construct

This manner, for instance, I can merely run the make launch command to create a launch model of my Swift package deal. I normally end-up including much more complicated instructions to the Makefile, one other widespread state of affairs is, when the package deal has an executable goal. I normally create an set up and uninstall command to rapidly setup or take away the binary product domestically. 🏗️

set up: launch
    set up ./.construct/launch/my-app /usr/native/bin/my-app

uninstall:
    rm /usr/native/bin/my-app

As you may know, these days I largely create Vapor-based apps (or Hummingbird, however that deserves a separate publish), so it is actually handy to have a devoted set of instructions inside my Makefile to handle the state of the server software. 💧

begin:
    my-app serve --port 8080 &
    
cease:
    @lsof -i :8080 -sTCP:LISTEN | awk 'NR > 1 {print $$2}' | xargs kill -15

restart: cease begin

reset: cease
    rm -f ./Sources/db.sqlite

Through the use of the & on the finish of the beginning command the server will run within the background, and utilizing the @ character earlier than the lsof command will silence the output of the make command (By default the make command will echo out your instructions as nicely).

Since all the pieces ought to work underneath Linux as nicely I usually use Docker to run the app in a container. I’ve a Docker cheat-sheet, however I am additionally a lazy developer, so I made just a few helpers within the Makefile.

#
# Dockerfile:
# ----------------------------------------
#
# FROM swift:5.7-amazonlinux2
# 
# WORKDIR /my-app
#
# ----------------------------------------
#

docker-build-image:
    docker construct -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

First it’s a must to construct the picture for the Swift software, for this objective you additionally must create a Dockerfile subsequent to the Makefile, however afterwards you possibly can create a disposable docker occasion from it by utilizing the make docker-run command. 🐳

There are two extra matters I would like to speak about. The primary one is said to code protection technology for Swift package deal supervisor based mostly apps. Here’s what I’ve in my Makefile to assist this:

test-with-coverage:
    swift take a look at --parallel --enable-code-coverage

# 
# Set up dependencies (on macOS):
# ----------------------------------------
# brew set up llvm
# echo 'export PATH="/usr/native/decide/llvm/bin:$PATH"' >> ~/.zshrc
# ----------------------------------------
# 
code-coverage: test-with-coverage
    llvm-cov report 
        .construct/x86_64-apple-macosx/debug/myAppPackageTests.xctest/Contents/MacOS/myAppPackageTests 
        -instr-profile=.construct/x86_64-apple-macosx/debug/codecov/default.profdata 
        -ignore-filename-regex=".construct|Checks" 
        -use-color

You may simply generate code protection information by working the make code-coverage command. If you wish to know extra concerning the underlying particulars, please confer with the linked article.

The very very last thing goes to be about documentation. Apple launched DocC for Swift fairly a very long time in the past and now it looks like lots of people are utilizing it. Initially I used to be not an enormous fan of DocC, however now I’m for positive. It’s potential to simplify the doc technology course of by way of Makefiles and I are inclined to run the make docs-preview command very often to have a fast sneak peak of the API. 🔨

docs-preview:
    swift package deal --disable-sandbox preview-documentation --target MyLibrary

docs-generate:
    swift package deal generate-documentation 
        --target MyLibrary

docs-generate-static:
    swift package deal --disable-sandbox 
        generate-documentation 
        --transform-for-static-hosting 
        --hosting-base-path "MyLibrary" 
        --target MyLibrary 
        --output-path ./docs

In fact you possibly can add extra targets to your Makefile to automate your workflow as wanted. These are only a few widespread practices that I am at present utilizing for my server-side Swift tasks. iOS builders may benefit from Makefiles, there are some fairly lenghty xcodebuild associated instructions that you may simplify loads by utilizing a Makefile. 💪

Related Articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Latest Articles