tux

Il package manager è il sistema swift per costruire librerie ed eseguibili da condividere nei progetti. Prima di tutto verifichiamo la funzionalità del tool (utilizzo ubuntu server 16.04.2 LTS con swift 3.1.1 installato come descritto nel post Swift Ubuntu 16.04):

$ swift package
OVERVIEW: Perform operations on Swift packages

Installando swift su un server nuovo potrebbe mancare il pacchetto curl, nel caso:

$ sudo apt-get install libcurl4-openssl-dev

Creiamo la directory del nuovo pacchetto poi inizializziamo il pacchetto:

$ mkdir prova
$ cd prova
$ swift package init

Viene creata la struttura che segue.

.
├── Package.swift
├── Sources
│   └── prova.swift
└── Tests
    ├── LinuxMain.swift
    └── provaTests
└── provaTests.swift
3 directories, 4 files

Il file Package.swift viene chiamato file manifesto, è quello che contiene tutti i riferimenti per il pacchetto affinchè venga correttamente compilato.

// swift-tools-version:3.1

import PackageDescription
let package = Package(
name: "prova"
)

Il codice sorgente viene riposto nel file Sources/prova.swift

struct prova {
var text = "Hello, World!"
}

che il sistema ha gentilmente inizializzato con del codice campione. Digitare swift build per compilare il pacchetto scaricando automaticamente le dipendenze indicate nel file manifesto. Per verificare il pacchetto digitare swift test.

$ swift test
Compile Swift Module 'provaTests' (1 sources)
Linking ./.build/debug/provaPackageTests.xctest
Test Suite 'All tests' started at 16:05:19.192
Test Suite 'debug.xctest' started at 16:05:19.271
Test Suite 'provaTests' started at 16:05:19.271
Test Case 'provaTests.testExample' started at 16:05:19.271
Test Case 'provaTests.testExample' passed (0.0 seconds)
Test Suite 'provaTests' passed at 16:05:19.272
Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds
Test Suite 'debug.xctest' passed at 16:05:19.273
Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds
Test Suite 'All tests' passed at 16:05:19.273
Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds

Un pacchetto è considerato eseguibile se contiene un file denominato main.swift. Ripercorriamo i passi esposti sopra per generare un pacchetto eseguibile. Dopo aver cancellato ogni file creato in precedenza nella directory prova digitare i comandi esposti di seguito.

$ swift package init --type executable
Creating executable package: prova
Creating Package.swift
Creating .gitignore
Creating Sources/
Creating Sources/main.swift
$ swift build
Compile Swift Module 'prova' (1 sources)
Linking ./.build/debug/prova

A questo punto nella directory ./build/debug sarà presente il programma eseguibile.

Un ultimo appunto riguardo al modo di lavorare con più file sorgenti. Definendo ad esempio una funzione in un file differente dal file main.swift è possibile richiamare la funzione senza alcun tipo di importazione in quanto il nuovo file risiede nello stesso modulo di main. Vediamo un esempio:

/Sources$ touch saluto.swift

Inseriamo con un editor nel file saluto.swift la seguente funzione:

func DiCiao(nome: String) {
print("Ciao \(nome)")
}

Modifichiamo main.swift come di seguito:

if CommandLine.arguments.count != 2 {
print("Uso: prova NOME")
} else {
let nome = CommandLine.arguments[1]
DiCiao(nome: nome)
}

Compiliamo il pacchetto digitando swift build poi andiamo nella directory ./build/debug e lanciamo il programma prova:

.build/debug$ ./prova Paolo
Ciao Paolo