cat swift/swift-package-manager-base-professionale.md
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.