Section 12/181 menit

12. Monorepo & Local Package Development

12. Monorepo & Local Package Development

Struktur Monorepo SPM

swift
MyCompany/
├── Package.swift                      root package (opsional)
├── Apps/
   ├── MainApp/
      ├── MainApp.xcodeproj
      └── Package.swift
   └── WidgetExtension/
       └── Package.swift
├── Packages/
   ├── CoreDomain/
      └── Package.swift
   ├── NetworkLayer/
      └── Package.swift
   ├── UIComponents/
      └── Package.swift
   └── Analytics/
       └── Package.swift
└── Tools/
    ├── CodeGenPlugin/
       └── Package.swift
    └── LintingPlugin/
        └── Package.swift

Local Package Dependency

swift
// Apps/MainApp/Package.swift — menggunakan local packages
import PackageDescription

let package = Package(
    name: "MainApp",
    dependencies: [
        // Local packages — path relatif dari file Package.swift ini
        .package(path: "../../Packages/CoreDomain"),
        .package(path: "../../Packages/NetworkLayer"),
        .package(path: "../../Packages/UIComponents"),
        
        // Remote packages
        .package(url: "https://github.com/apple/swift-collections", from: "1.0.0")
    ],
    targets: [
        .target(
            name: "MainApp",
            dependencies: [
                .product(name: "CoreDomain", package: "CoreDomain"),
                .product(name: "NetworkLayer", package: "NetworkLayer"),
                .product(name: "UIComponents", package: "UIComponents")
            ]
        )
    ]
)

Edit Mode untuk Development Lokal

swift
# Clone dan edit package secara lokal sementara
# (tanpa mengubah Package.swift utama)
swift package edit swift-collections

# Sekarang swift-collections ada di ./checkouts/swift-collections/
# Edit file di sana, perubahan langsung terlihat

# Selesai editing — kembali ke versi dari Package.resolved
swift package unedit swift-collections

Workspace Pattern di Xcode

Untuk development dengan local packages di Xcode, buat .xcworkspace:

swift
MyProject.xcworkspace/
├── contents.xcworkspacedata
└── ...

# contents.xcworkspacedata
<?xml version="1.0" encoding="UTF-8"?>
<Workspace version="1.0">
   <FileRef location="group:MyApp/MyApp.xcodeproj"/>
   <FileRef location="group:../Packages/CoreDomain/Package.swift"/>
   <FileRef location="group:../Packages/UIComponents/Package.swift"/>
</Workspace>

Dengan workspace, kamu bisa edit package dan app dalam satu sesi Xcode, dengan full autocomplete dan refactoring support.