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
150
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
110
Swift rEvolution
konstantinkoval
1
220
Refactoring an Ugly Objective-C with Swift
konstantinkoval
0
200
React Native - from a mobile (iOS) developer prospective
konstantinkoval
0
61
Swift - Pushing technology limits
konstantinkoval
1
210
WatchKit
konstantinkoval
0
53
Intro in WatchKit and Watch apps
konstantinkoval
0
44
Functional Swift
konstantinkoval
1
110
I love swift.pdf
konstantinkoval
1
170
Other Decks in Programming
See All in Programming
Micro Frontends for Java Microservices - Devnexus 2024
mraible
PRO
0
500
"config" ってなんだ? / What is "config"?
okashoi
0
240
if constexpr文はテンプレート世界のラムダ式である
faithandbrave
3
650
#phpcon_odawara オープン・クローズドなテストフィクスチャを求めて / open closed test fixtures
77web
3
230
CDKコントリビュートの最初の壁を越えよう! -簡単issueの見つけ方-
badmintoncryer
1
110
OpenAPIを中心に考えるAPI開発入門 / Introduction to API Development with a Focus on OpenAPI
seike460
PRO
2
170
try! Swift Tokyo 初参加報告LT
hinakko2
0
220
Azure OpenAI Serviceのプロンプトエンジニアリング入門
tomokusaba
3
770
Ruby Pattern Matching
bkuhlmann
0
930
使ってみよう Azure AI Document Intelligence
kosmosebi
2
330
MicrosoftのPlatform Engineeringガイドを読んで実際になにかやってみた
ymd65536
1
400
Let's learn code review
riofujimon
2
490
Featured
See All Featured
Music & Morning Musume
bryan
41
5.6k
Art, The Web, and Tiny UX
lynnandtonic
289
19k
Scaling GitHub
holman
457
140k
Code Review Best Practice
trishagee
55
15k
Practical Orchestrator
shlominoach
182
9.7k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
244
20k
Designing for humans not robots
tammielis
248
25k
Optimising Largest Contentful Paint
csswizardry
8
2.4k
Product Roadmaps are Hard
iamctodd
44
9.7k
A better future with KSS
kneath
231
16k
Happy Clients
brianwarren
92
6.4k
From Idea to $5000 a Month in 5 Months
shpigford
377
45k
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