80 lines
1.6 KiB
Markdown
80 lines
1.6 KiB
Markdown
# Scaffold a SwiftPM macOS app (no Xcode)
|
|
|
|
## Steps
|
|
1) Create a repo and initialize SwiftPM:
|
|
```
|
|
mkdir MyApp
|
|
cd MyApp
|
|
swift package init --type executable
|
|
```
|
|
|
|
2) Update `Package.swift` to target macOS and define an executable target for the app.
|
|
|
|
3) Create the app entry point under `Sources/MyApp/`.
|
|
- Use SwiftUI if you want a windowed app with minimal AppKit glue.
|
|
- Use AppKit if you want a menu bar or accessory-style app.
|
|
|
|
4) If you need app resources, add:
|
|
```
|
|
resources: [.process("Resources")]
|
|
```
|
|
and create `Sources/MyApp/Resources/`.
|
|
|
|
5) Add a `version.env` file (used by packaging templates):
|
|
```
|
|
MARKETING_VERSION=0.1.0
|
|
BUILD_NUMBER=1
|
|
```
|
|
|
|
6) Copy script templates from `assets/templates/` into your repo (for example, `Scripts/`).
|
|
|
|
## Minimal Package.swift (example)
|
|
```
|
|
// swift-tools-version: 6.2
|
|
import PackageDescription
|
|
|
|
let package = Package(
|
|
name: "MyApp",
|
|
platforms: [.macOS(.v14)],
|
|
targets: [
|
|
.executableTarget(
|
|
name: "MyApp",
|
|
path: "Sources/MyApp",
|
|
resources: [
|
|
.process("Resources")
|
|
])
|
|
]
|
|
)
|
|
```
|
|
|
|
## Minimal SwiftUI entry point (example)
|
|
```
|
|
import SwiftUI
|
|
|
|
@main
|
|
struct MyApp: App {
|
|
var body: some Scene {
|
|
WindowGroup {
|
|
Text("Hello")
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## Minimal AppKit entry point (example)
|
|
```
|
|
import AppKit
|
|
|
|
final class AppDelegate: NSObject, NSApplicationDelegate {
|
|
func applicationDidFinishLaunching(_ notification: Notification) {
|
|
// Initialize app state here.
|
|
}
|
|
}
|
|
|
|
let app = NSApplication.shared
|
|
let delegate = AppDelegate()
|
|
app.delegate = delegate
|
|
app.setActivationPolicy(.regular)
|
|
app.run()
|
|
```
|