Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Swift Package Manager
Search
Konstantin
November 19, 2016
Programming
2
180
Swift Package Manager
Let’s make dependency manager great, Finally!
Konstantin
November 19, 2016
Tweet
Share
More Decks by Konstantin
See All by Konstantin
How does complier see your app
konstantinkoval
4
160
Swift rEvolution
konstantinkoval
1
240
Refactoring an Ugly Objective-C with Swift
konstantinkoval
0
240
React Native - from a mobile (iOS) developer prospective
konstantinkoval
0
74
Swift - Pushing technology limits
konstantinkoval
1
250
WatchKit
konstantinkoval
0
65
Intro in WatchKit and Watch apps
konstantinkoval
0
65
Functional Swift
konstantinkoval
1
150
I love swift.pdf
konstantinkoval
1
200
Other Decks in Programming
See All in Programming
どの様にAIエージェントと 協業すべきだったのか?
takefumiyoshii
1
580
気づいて!アプリからのSOS 〜App Store Connect APIで始めるパフォーマンス健康診断〜
waka12
0
260
クラシルを支える技術と組織
rakutek
0
190
Web技術を最大限活用してRAW画像を現像する / Developing RAW Images on the Web
ssssota
2
1.1k
AIで開発生産性を上げる個人とチームの取り組み
taniigo
0
130
CSC509 Lecture 03
javiergs
PRO
0
320
パフォーマンスチューニングで Web 技術を深掘り直す
progfay
18
4.9k
Local Peer-to-Peer APIはどのように使われていくのか?
hal_spidernight
2
440
詳しくない分野でのVibe Codingで困ったことと学び/vibe-coding-in-unfamiliar-area
shibayu36
3
3.7k
ABEMAモバイルアプリが Kotlin Multiplatformと歩んだ5年 ─ 導入と運用、成功と課題 / iOSDC 2025
akkyie
0
310
猫と暮らすネットワークカメラ生活🐈 ~Vision frameworkでペットを愛でよう~ / iOSDC Japan 2025
yutailang0119
0
220
WebエンジニアがSwiftをブラウザで動かすプレイグラウンドを作ってみた
ohmori_yusuke
0
170
Featured
See All Featured
Being A Developer After 40
akosma
91
590k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
960
Raft: Consensus for Rubyists
vanstee
139
7.1k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Mobile First: as difficult as doing things right
swwweet
224
9.9k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
53k
It's Worth the Effort
3n
187
28k
YesSQL, Process and Tooling at Scale
rocio
173
14k
jQuery: Nuts, Bolts and Bling
dougneiner
64
7.9k
Making the Leap to Tech Lead
cromwellryan
135
9.5k
How to Ace a Technical Interview
jacobian
280
23k
Transcript
Swift Package Manager or Let’s make dependency manager great, Finally!
Kostiantyn Koval @Agens AS • Swift from day 1 •
Swift Hight Performance • Swift Package Manager • @KostiaKoval
pod install
How it used to be ! ... • Static libraries
lib.a • Copied source • Subproject + Workspace • Submodules
The problems ! • Closed code / Precompiled • Hard
to discover • No versioning • Duplicate Symbols a->c, b->c App ->(a, b) Duplicate 'c'
CocoaPods - Easy • Centralized • Podspec • Static Libs
+ Frameworks • Modifies Xcode projects + workspace Res: Workspace
Carthage - Simple • Decentralized • No Podspec • Git
+ Xcode • Frameworks Res: Frameworks
Happy
Problems • Not integrated with ! • Xcode private API
and Format • Custom scripts • Limited
SwiftPM
Why it was built? iOS Linux
SwiftPM Cross platform, Convention approach, Decentralized is a tool to
automate the process of downloading, compiling, and linking dependencies. — Swift .org
SwiftPM Fetch Build Test swift package swift build swift test
"swift package" clean Delete build artifacts describe Describe the current
package dump-package Print parsed Package.swift as JSON fetch Fetch package dependencies generate-xcodeproj Generates an Xcode project init Initialize a new package reset Reset the complete cache/build directory show-dependencies Print the resolved dependency graph update Update package dependencies
What is a Swift Package ?
What is a Swift Package ? Package.swift import PackageDescription let
package = Package( name: "Empty" )
What is a Swift Package ? • Swift, C, C++,
Objective-C, Objective-C++ One language per module • library (static, dynamic), executable, system-module
Package Convention Source in - /Sources Tests in - /Tests
Executable - main.swift Lib - SomeLib.swift C headers - /include/Baz.h
Package //executable lib with tests . . ├── Package.swift ├──
Package.swift ├── Sources ├── Sources └── main.swift │ └── Lib.swift └── Tests ├── LibTests │ └── LibTests.swift └── LinuxMain.swift
Package // 2 Modules system-module . . ├── Package.swift ├──
Package.swift └── Sources └── module.modulemap ├── A │ └── A.swift └── B └── someCode.swift
system-module // module.modulemap module Clibgit [system] { header "/usr/local/include/git2.h" link
"git2" export * }
! ship IT
Package + Git = ! • Step N1: git init,
commit, tag 0.1.0, push
Package + Git = ! • Step N2: There is
no Step N2 !
Package + Git = ! let package = Package( name:
"Empty" dependencies: [ .Package(url: "https://github.com/MyAwesomePackage", majorVersion: 0), ] ) semver, semver, semver -> Semver.org
Package Dependency let package = Package( name: "Empty" dependencies: [
.Package(url: "https://github.com/MyAwesomePackage", majorVersion: 0), .Package(url: "https://github.com/MyAwesomePackage", majorVersion: 1, minor: 4), .Package(url: "ssh://
[email protected]
/Greeter.git", versions: Version(1,0,0)..<Version(2,0,0)), .Package(url: "../StringExtensions", "1.0.0-alpha+001"), .Package(url: "../Package", version: Version(0, 1, 0), .Package(url: "../AwesomePackage", version: Version(0, 1, 0, prereleaseIdentifiers: ["alpha"], buildMetadataIdentifier: "001"), ] )
Package Power Package( name: String, dependencies: [Package.Dependency] = [], targets:
[Target] = [], exclude: [String] = [] pkgConfig: String? = nil, providers: [SystemPackageProvider]? = nil, )
Package Targets 3 Targets: Core, Network, Login . ├── Package.swift
└── Sources ├── Core │ └── core.swift ├── Login │ └── loginAPI.swift └── Network └── coreNetwork.swift
Package Targets 3 Targets: Core, Network, Login let package =
Package( name: "App", targets: [ Target(name: "Login", dependencies: ["Core", "Network"]), ] )
Package exclude let package = Package( name: "Lib", exclude: ["Sources/mocJSON",
"Sources/LibAReadme.md", "Tests/FooTests/images"] )
Package pkg-config // module.modulemap module Clibgit [system] { header "/usr/local/include/git2.h"
link "git2" export * } swift build -Xcc -I.. -Xlinker -L/usr/local/lib/
Package pkg-config swift build -Xcc -I.. -Xlinker -L/usr/local/lib/ let package
= Package( name: "Clibgit", pkgConfig: "libgit2" )
Package pkg-config swift build let package = Package( name: "Clibgit",
pkgConfig: "libgit2" )
Package pkg-config //libgit2.pc file ... Cflags: -I${includedir}/libgit2 Libs: -L${libdir} -llibgit2
What if the system package is not there? !"
Package Providers let package = Package( name: "Clibgit", pkgConfig: "libgit2",
providers: [ .Brew("libgit2"), .Apt("libgit2") ] )
Coming Soon ... Product Definitions let package = Package( name:
"MyServer", ... products: [ .Library(name: "ClientLib", type: .static, targets: ["ClientAPI"]), .Library(name: "ServerLib", type: .dynamic, targets: ["ServerAPI"]), .Executable(name: "myserver", targets: ["ServerDaemon"]), ] ) "Package Manager Product Definitions"
Xcode Integration swift package generate-xcodeproj . ├── Package.swift └── Sources
├── A │ └── A.swift └── B └── Code.swift
Xcode Integration swift package generate-xcodeproj --xcconfig-overrides Config.xcconfig . ├── Package.swift
└── Sources ├── A │ └── A.swift └── B └── Code.swift
But is it ready for Production and big Projects?
SwiftPM uses SwiftPM to "build and test" SwiftPM
SwiftPM • 19 Modules • 31 Targets • 13 Test
Modules • A lot of Code an Tests
None
It does handle the Scale
The iOS !
Does the SwiftPM solves the issue? YES!, kind off, it
will. ! • Painless config • Right Xcode project integration • Full Build & Tests control • Open Source • Many, many more ...
swift build The new -
Thanks @KostiaKoval
None