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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Konstantin
November 19, 2016
Programming
2
200
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
180
Swift rEvolution
konstantinkoval
1
250
Refactoring an Ugly Objective-C with Swift
konstantinkoval
0
250
React Native - from a mobile (iOS) developer prospective
konstantinkoval
0
86
Swift - Pushing technology limits
konstantinkoval
1
280
WatchKit
konstantinkoval
0
83
Intro in WatchKit and Watch apps
konstantinkoval
0
75
Functional Swift
konstantinkoval
1
160
I love swift.pdf
konstantinkoval
1
210
Other Decks in Programming
See All in Programming
PHPで TLSのプロトコルを実装してみる
higaki_program
0
570
車輪の再発明をしよう!PHP で実装して学ぶ、Web サーバーの仕組みと HTTP の正体
h1r0
2
440
コードレビューをしない選択 #でぃーぷらすトウキョウ
kajitack
3
1.2k
実践ハーネスエンジニアリング #MOSHTech
kajitack
7
4.9k
L’IA au service des devs : Anatomie d'un assistant de Code Review
toham
0
120
ファインチューニングせずメインコンペを解く方法
pokutuna
0
220
Laravel Nightwatchの裏側 - Laravel公式Observabilityツールを支える設計と実装
avosalmon
1
270
AIと共にエンジニアとPMの “二刀流”を実現する
naruogram
0
100
S3ストレージクラスの「見える」「ある」「使える」は全部違う ─ 体験から見た、仕様の深淵を覗く
ya_ma23
0
1.2k
LM Linkで(非力な!)ノートPCでローカルLLM
seosoft
0
270
Cyrius ーLinux非依存にコンテナをネイティブ実行する専用OSー
n4mlz
0
260
Codex CLI でつくる、Issue から merge までの開発フロー
amata1219
0
240
Featured
See All Featured
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
300
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
190
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
440
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.6k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
230
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
180
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
500
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
390
WCS-LA-2024
lcolladotor
0
500
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
10k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.7k
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