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
150
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
62
Intro in WatchKit and Watch apps
konstantinkoval
0
65
Functional Swift
konstantinkoval
1
140
I love swift.pdf
konstantinkoval
1
200
Other Decks in Programming
See All in Programming
デザイナーが Androidエンジニアに 挑戦してみた
874wokiite
0
550
実用的なGOCACHEPROG実装をするために / golang.tokyo #40
mazrean
1
300
go test -json そして testing.T.Attr / Kyoto.go #63
utgwkk
3
310
速いWebフレームワークを作る
yusukebe
5
1.7k
ファインディ株式会社におけるMCP活用とサービス開発
starfish719
0
2.1k
Processing Gem ベースの、2D レトロゲームエンジンの開発
tokujiros
2
130
How Android Uses Data Structures Behind The Scenes
l2hyunwoo
0
480
もうちょっといいRubyプロファイラを作りたい (2025)
osyoyu
1
460
さようなら Date。 ようこそTemporal! 3年間先行利用して得られた知見の共有
8beeeaaat
3
1.5k
旅行プランAIエージェント開発の裏側
ippo012
2
930
MCPとデザインシステムに立脚したデザインと実装の融合
yukukotani
4
1.5k
Zendeskのチケットを Amazon Bedrockで 解析した
ryokosuge
3
320
Featured
See All Featured
How to Ace a Technical Interview
jacobian
279
23k
How STYLIGHT went responsive
nonsquared
100
5.8k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.7k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
30
9.7k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
Building Adaptive Systems
keathley
43
2.7k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3k
How to train your dragon (web standard)
notwaldorf
96
6.2k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
We Have a Design System, Now What?
morganepeng
53
7.8k
Faster Mobile Websites
deanohume
309
31k
Thoughts on Productivity
jonyablonski
70
4.8k
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