Section 4/171 menit

4. Struktur Package & Package.swift

4. Struktur Package & Package.swift

Layout Standar

swift
MyPackage/
├── Package.swift               # Manifest
├── Package.resolved            # Lock file (auto-generated)
├── README.md
├── Sources/
│   ├── MyLib/                  # Source target
│   │   ├── Public.swift
│   │   └── Internal.swift
│   └── MyExecutable/           # Executable target
│       └── main.swift
├── Tests/
│   └── MyLibTests/
│       └── MyLibTests.swift
└── .build/                     # Build artifacts (gitignored)

SPM mengandalkan convention: target bernama MyLib otomatis melihat ke Sources/MyLib/. Bisa dioverride via parameter path:.

Manifest Minimal

swift
// swift-tools-version:5.10
// Komentar di atas: WAJIB di baris pertama. Menentukan versi tools minimum.
import PackageDescription

let package = Package(
    name: "MyLib",
    products: [
        .library(name: "MyLib", targets: ["MyLib"]),
    ],
    targets: [
        .target(name: "MyLib"),
        .testTarget(name: "MyLibTests", dependencies: ["MyLib"]),
    ]
)

Komponen kunci:

Field Fungsi
swift-tools-version Versi minimum SPM / Swift toolchain
name Identifier package (bukan path)
platforms Min OS version per platform
products API publik (library/executable yang bisa di-depend)
dependencies Package eksternal yang dibutuhkan
targets Unit kompilasi internal

Manifest dengan Platform & Dependency

swift
// swift-tools-version:5.10
import PackageDescription

let package = Package(
    name: "MyApp",
    platforms: [
        .iOS(.v16),
        .macOS(.v13),
    ],
    products: [
        .library(name: "AppCore", targets: ["AppCore"]),
    ],
    dependencies: [
        .package(url: "https://github.com/apple/swift-collections.git", from: "1.0.0"),
        .package(url: "https://github.com/pointfreeco/swift-snapshot-testing.git", from: "1.15.0"),
    ],
    targets: [
        .target(
            name: "AppCore",
            dependencies: [
                .product(name: "Collections", package: "swift-collections"),
            ]
        ),
        .testTarget(
            name: "AppCoreTests",
            dependencies: [
                "AppCore",
                .product(name: "SnapshotTesting", package: "swift-snapshot-testing"),
            ]
        ),
    ]
)