cat swift/swift-package-manager-base-professionale.md

Lezione 39 40 min

Swift Package Manager come base professionale

SwiftPM non è solo un modo per scaricare dipendenze: è la base per organizzare, testare, documentare e distribuire codice Swift.

Swift Package Manager, spesso abbreviato in SwiftPM, è il sistema standard per organizzare package Swift. Un corso serio su Swift deve trattarlo presto: non come appendice, ma come parte del mestiere.

Quando lavori professionalmente, non scrivi solo file .swift isolati. Scrivi moduli, test, librerie, strumenti, documentazione è configurazioni riproducibili.

SwiftPM tiene insieme tutto questo.

Cosa fa SwiftPM

SwiftPM permette di:

  • creare package;
  • definire librerie ed eseguibili;
  • organizzare target;
  • dichiarare dipendenze;
  • compilare;
  • eseguire test;
  • generare documentazione;
  • lavorare in modo cross-platform.

Comandi base:

swift package init
swift build
swift test
swift run

Già questi quattro comandi cambiano il modo in cui lavori: il progetto non dipende solo da un IDE.

Package come confine

Un package è un’unità di distribuzione. Dentro può contenere uno o più target.

Esempio:

CouponKit/
  Package.swift
  Sources/
    CouponKit/
      Coupon.swift
  Tests/
    CouponKitTests/
      CouponTests.swift

Il file Package.swift descrive il package.

Sources contiene il codice.

Tests contiene i test.

Questa struttura rende il progetto comprensibile anche fuori da Xcode.

Perché partire da un package

Anche se stai costruendo una app, isolare logica di dominio in un package è una scelta forte:

  • test più rapidi;
  • confini più chiari;
  • riuso tra app, CLI e server;
  • dipendenze controllate;
  • documentazione generabile;
  • CI più semplice.

Nel nostro corso, CouponKit o ProductAPIKit possono vivere come package indipendenti. La UI diventa solo una delle possibili superfici.

Library target

Un target libreria contiene codice importabile:

let package = Package(
  name: "CouponKit",
  products: [
    .library(name: "CouponKit", targets: ["CouponKit"])
  ],
  targets: [
    .target(name: "CouponKit")
  ]
)

Poi in un altro target:

import CouponKit

Il prodotto .library è ciò che rendi disponibile.

Executable target

Un target eseguibile produce un comando:

.executableTarget(
  name: "coupon-cli",
  dependencies: ["CouponKit"]
)

Questo è utile per:

  • strumenti interni;
  • demo;
  • migrazioni;
  • script Swift;
  • CLI da distribuire.

Test target

.testTarget(
  name: "CouponKitTests",
  dependencies: ["CouponKit"]
)

Il test target dipende dal codice da testare. Questo ti costringe a ragionare sui confini pubblici/internal del modulo.

SwiftPM e IDE

SwiftPM non sostituisce l’IDE. Lo rende meno centrale.

Puoi aprire un package in Xcode, usare VS Code/Cursor con estensione Swift, o lavorare da terminale. La struttura resta la stessa.

Questa portabilità è importante, soprattutto per codice server, CLI, librerie e ambienti CI.

Checklist

Quando inizi un progetto Swift:

  • posso isolare il dominio in un package?
  • quali target servono?
  • ho una libreria, un eseguibile o entrambi?
  • i test vivono in un target separato?
  • il progetto si costruisce con swift build?
  • i test passano con swift test?

Esercizio

Crea un package:

mkdir CouponKit
cd CouponKit
swift package init --type library
swift build
swift test

Poi aggiungi una struct Coupon minimale in Sources/CouponKit è un test in Tests/CouponKitTests.

L’obiettivo è avere un package che compila e testa da terminale.