Ga naar inhoud

Swift Package Manager

De Swift Package Manager (SPM) wordt gebruikt voor het bouwen van de broncode en afhankelijkheden van uw project. Aangezien Vapor zwaar leunt op SPM, is het een goed idee om de basis van hoe het werkt te begrijpen.

SPM is vergelijkbaar met Cocoapods, Ruby gems, en NPM. U kunt SPM vanaf de command line gebruiken met commando's als swift build en swift test of met compatibele IDE's. Echter, in tegenstelling tot sommige andere pakketbeheerders, is er geen centrale pakket index voor SPM pakketten. SPM maakt in plaats daarvan gebruik van URLs naar Git repositories en versies afhankelijkheden met behulp van Git tags.

Package Manifest

De eerste plaats waar SPM kijkt in uw project is het package manifest. Dit moet altijd in de root directory van je project staan en Package.swift heten.

Een voorbeeld van een package manifest kan hieronder gevonden worden.

// swift-tools-version:5.2
import PackageDescription

let package = Package(
    name: "app",
    platforms: [
       .macOS(.v10_15)
    ],
    products: [
        .executable(name: "Run", targets: ["Run"]),
        .library(name: "App", targets: ["App"]),
    ],
    dependencies: [
        .package(url: "https://github.com/vapor/vapor.git", from: "4.0.0"),
    ],
    targets: [
        .target(name: "App", dependencies: [.product(name: "Vapor", package: "vapor")]),
        .target(name: "Run", dependencies: ["App"]),
        .testTarget(name: "AppTests", dependencies: ["App"])
    ]
)

Elk onderdeel van het manifest wordt in de volgende secties toegelicht.

Tools Version

De allereerste regel van een pakketmanifest geeft de vereiste versie van Swift-tools aan. Dit specificeert de minimale versie van Swift die het pakket ondersteunt. De API van de pakketbeschrijving kan ook veranderen tussen Swift-versies, dus deze regel zorgt ervoor dat Swift weet hoe het je manifest moet parsen.

Package Name

Het eerste argument voor Package is de naam van het pakket. Als het pakket publiek is, zou je het laatste segment van de Git repo URL als naam moeten gebruiken.

Platforms

De platforms array specificeert welke platformen dit pakket ondersteunt. Door .macOS(.v10_14) op te geven heeft dit pakket macOS Mojave of hoger nodig. Wanneer Xcode dit project laadt, zal het automatisch de minimale deployment versie op 10.14 zetten, zodat je alle beschikbare APIs kunt gebruiken.

Products

Producten zijn targets die je package produceert als het gebouwd is. In dit pakket zijn er twee targets. Een bibliotheek en een uitvoerbaar bestand.

Dependencies

Afhankelijkheden zijn andere SPM pakketten waar uw pakket afhankelijk van is. Alle Vapor applicaties vertrouwen op het Vapor pakket, maar u kunt zoveel andere afhankelijkheden toevoegen als u wilt.

In het bovenstaande voorbeeld kunt u zien dat vapor/vapor versie 4.0.0 of later een dependency is van dit pakket. Wanneer u een afhankelijkheid aan uw pakket toevoegt, moet u vervolgens aangeven welke targets afhankelijk zijn van de nieuw beschikbare modules.

Targets

Targets zijn alle modules, executables, en testen die je package bevat. De meeste Vapor applicaties zullen drie targets hebben, hoewel je er zoveel kunt toevoegen als je wilt om je code te organiseren. Elke target verklaart van welke modules het afhankelijk is. Je moet hier namen van modules toevoegen om ze te kunnen importeren in je code. Een target kan afhangen van andere targets in je project of van modules die je hebt toegevoegd aan de main dependencies array.

Tip

Executable targets (targets die een main.swift bestand bevatten) kunnen niet door andere modules worden geïmporteerd. Dit is de reden waarom Vapor zowel een App als een Run target heeft. Alle code die u in App opneemt kan getest worden in de AppTests.

Folder Structure

Hieronder ziet u de typische mappenstructuur voor een SPM-pakket.

.
├── Sources
│   ├── App
│   │   └── (Source code)
│   └── Run
│       └── main.swift
├── Tests
│   └── AppTests
└── Package.swift

Elk .target komt overeen met een map in de Sources map. Elk .testTarget komt overeen met een map in de Tests map.

Package.resolved

De eerste keer dat u uw project bouwt, zal SPM een Package.resolved bestand maken dat de versie van elke dependency opslaat. De volgende keer dat u uw project bouwt, zullen dezelfde versies worden gebruikt, zelfs als er nieuwere versies beschikbaar zijn.

Om uw dependencies te updaten, voert u swift package update uit.

Xcode

Als je Xcode 11 of hoger gebruikt, zullen wijzigingen in afhankelijkheden, targets, producten, etc automatisch gebeuren wanneer het Package.swift bestand wordt gewijzigd.

Als je wilt updaten naar de laatste afhankelijkheden, gebruik dan File → Swift Packages → Update To Latest Swift Package Versions.

Je wilt misschien ook het .swiftpm bestand toevoegen aan je .gitignore. Dit is waar Xcode je Xcode project configuratie opslaat.