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
giginet
PRO
September 12, 2018
Programming
690
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
わいわいSwift Package Manager
https://iosdiscord.connpass.com/event/97606/
giginet
PRO
September 12, 2018
More Decks by giginet
See All by giginet
🀄️ on swiftc
giginet
PRO
0
560
15年メンテしてきたdotfilesから開発トレンドを振り返る 2011 - 2026
giginet
PRO
2
430
Claude Codeログ基盤の構築
giginet
PRO
7
4.5k
Inside of Swift Export
giginet
PRO
1
3.1k
Swiftビルド弾丸ツアー - Swift Buildが作る新しいエコシステム
giginet
PRO
0
2.9k
SwiftでMCPサーバーを作ろう!
giginet
PRO
3
470
Creating Intuitive Developer Tool in Swift
giginet
PRO
0
1.6k
Mergeable Libraryで 高速なアプリ起動を実現しよう!
giginet
PRO
2
8.3k
5分でわかるExplicitly Built Modules
giginet
PRO
2
1.9k
Other Decks in Programming
See All in Programming
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
250
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.6k
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
960
Go 1.27 における memory allocation の高速化
andpad
0
240
楽しそうなつよつよエンジニアと目が死んでる僕/A brilliant engineer having a blast, and dead-eyed me.
3l4l5
2
190
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.3k
仕様駆動開発の消費期限
watany
20
8.6k
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
710
数百円から始めるRuby電子工作
tarosay
0
160
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
310
バグを直したら useEffect が消えた
colorful12
2
590
freeeにおけるEvalsの実践例の紹介
freee
PRO
0
120
Featured
See All Featured
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
340
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
340
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
400
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
The Pragmatic Product Professional
lauravandoore
37
7.4k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
480
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
250
Unsuck your backbone
ammeep
672
58k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
280
Transcript
Θ͍Θ͍Swift Package Manager Θ͍Θ͍swiftc #5 @giginet
Agenda • SPM System library • Package Description V4.2 •
How to develop
Motivation • App Store Connect APIΫϥΠΞϯτΛSwiftͰ࡞ͬͯͨ • ৄࡉiOSDC Reject Conference
Day1Ͱʂʂʂ • JSON Web TokenͷॲཧʹCͷϥΠϒϥϦΛ͍͔ͨͬͨ
System Library • ΄͔ͷύοέʔδϚωʔδϟʔͰೖΕͨStatic LibraryΛSPMͰ ఏڙ͢Δͭ
OpenSSL • https://github.com/IBM-Swift/OpenSSL . !"" LICENSE.txt !"" Package.swift !""
[email protected]
!"" README.md !"" module.modulemap #"" shim.h
module.modulemap • libssl, libcryptoʹlink module OpenSSL [system] { header "shim.h"
link "ssl" link "crypto" }
shim.h #ifndef OpenSSLHelper_h #define OpenSSLHelper_h #include <openssl/conf.h> #include <openssl/evp.h> #include
<openssl/err.h> #include <openssl/bio.h> #include <openssl/ssl.h> #include <openssl/md4.h> #include <openssl/md5.h> #include <openssl/sha.h> #include <openssl/hmac.h> #include <openssl/rand.h> #include <openssl/pkcs12.h> #include <openssl/x509v3.h> // (ry
Package.swift import PackageDescription let package = Package( name: "OpenSSL", providers:
[ .apt(["openssl libssl-dev"]), .brew(["openssl"]), ], products: [ .library( name: "OpenSSL", targets: ["OpenSSL"] ) ], targets: [ .target(name: "OpenSSL") ] )
How to init modulemap $ swift package init --type modulemap
How to use • .packageͰଞͷύοέʔδͱಉ͡Α͏ʹΈࠐΊΔ • Swift͔Β؆୯ʹCͷAPIୟ͚Δ import PackageDescription let
package = Package( name: "Wormhole", products: [ .library( name: "Wormhole", targets: ["Wormhole"]), ], dependencies: [ .package(url: "https://github.com/giginet/libjwt-swift.git", from: "1.0.0"), ], targets: [ .target( name: "Wormhole", dependencies: ["Result", "JWT"]), ] )
libjwt-swift • https://github.com/giginet/libjwt-swift • JWTΛѻ͏CϥΠϒϥϦΛSwift͔Β͔ͭ͑ΔΑ͏ʹౕͨ͠
! import Foundation import JWT struct JWTEncoder { func encode(issuerID:
UUID, keyID: String) throws -> String { let object = UnsafeMutablePointer<OpaquePointer?>.allocate(capacity: MemoryLayout<OpaquePointer>.size) jwt_new(object) defer { jwt_free(object.pointee) } let keyPointer = convertToCString(privateKey) defer { keyPointer.deallocate() } jwt_set_alg(object.pointee, JWT_ALG_ES256, keyPointer, Int32(privateKey.utf16.count + 1)) // https://github.com/benmcollins/libjwt/pull/71 jwt_add_header(object.pointee, "kid", keyID) jwt_add_grant(object.pointee, "iss", issuerID.uuidString.lowercased()) let expirationDate = Date().addingTimeInterval(expirationInterval) jwt_add_grant_int(object.pointee, "exp", Int(expirationDate.timeIntervalSince1970)) jwt_add_grant(object.pointee, "aud", "appstoreconnect-v1") guard let encodedCString = jwt_encode_str(object.pointee) else { throw Error.decodeError } return String(cString: encodedCString) } }
Deprecation • Xcode beta 6ͷToolchainͩͱͳ͘ಈ͘ • DEVELOPMENT SNAPSHOT(9/8ݱࡏ)ͩͱwarningग़Δ
None
ࠓ·Ͱͷ4.2͔Βdeprecatedͳ ͷͰΕ͍ͯͩ͘͞
System Library(>=4.2) • SPM Package Description v4.2͔ΒSystem Library͕αϙʔτ • System
LibraryΛύοέʔδ͔ΒࢀরͰ͖ΔΑ͏ʹ • https://github.com/apple/swift-package-manager/blob/master/ Documentation/PackageDescriptionV4_2.md
How to Use • .systemLibraryͷଘࡏυΩϡϝϯτʹॻ͍ͯ͋Δ • ͍ํͷυΩϡϝϯτ͕ͳ͍ • ॻ͖͔͚ͷυΩϡϝϯτ͕Ϛʔδ͞Εͯͳ͍ঢ়ଶͰൃݟ͞Εͨ •
https://github.com/apple/swift-package-manager/blob/ 40d319d7bb1a8cb42b187a4cbfa72515c61ebc44/ Documentation/Usage.md
Directories Sources !"" jwt #"" jwt.h !"" module.modulemap
// swift-tools-version:4.2 // The swift-tools-version declares the minimum version of
Swift required to build this package. import PackageDescription let package = Package( name: "Wormhole", products: [ .library( name: "Wormhole", targets: ["Wormhole"]), ], targets: [ .systemLibrary(name: "JWT", path: "./Sources/jwt", providers: [.brew(["libjwt"]), .apt(["libjwt"])]), .target( name: "Wormhole", dependencies: ["Result", "JWT"]), ] )
Local Package • PD v4.2͔ΒϩʔΧϧύεͰͷdependencyʹରԠ import PackageDescription let package =
Package( name: "MyPackage", dependencies: [ .package(path: "../example-package-playingcard"), ], targets: [ .target( name: "MyPackage", dependencies: ["PlayingCard"] ), ] )
Achievement • ~ͷల։͕όά͍ͬͯͨͷͰࡢͨ͠ • https://github.com/apple/swift-package-manager/pull/1779 $ swift build --disable-package-manifest-caching error:
/Users/giginet/work/myexecutable/~/work/MyPackage has no manifest 'myexecutable' /Users/giginet/work/myexecutable: error: product dependency 'MyPackage' not found
Starting SPM development
SPM • SwiftͰ։ൃՄೳ • llbuildC++ • ͪΐͬͱPython(2) • Ϗϧυͷཱྀ͕ͳ͍ •
ϏϧυࡁΈToolchainΛ͑ྑ͍ • SPMͱswift-llbuild͚ͩඞཁ
Bootstrap • Documentation/Development.mdͱREADME.mdΛಡΉ • ͦΕͰएׯϋϚΔ
Select Toolchain • /Library/Developer/Toolchains/swift-latest.xctoolchain/ Info.plistΛݟΔ • CFBundleVersionͷΛڥมͰ͢ $ export TOOLCHAINS=org.swift.4220180908a
Build $ ./Utilities/bootstrap --verbose
Use development SPM #!/usr/bin/env bash /path/to/swift-source/swiftpm/.build/debug/spm "$@"
Xcode $ ./Utilities/bootstrap --generate-xcodeproj generated: ./SwiftPM.xcodeproj $ open SwiftPM.xcodeproj
LLDB • Xcode > Debug > Attach to Process by
PID or Name...
Next • ManifestͷύʔαʔͰόάݟ͚ͭͨͷͰۙʑ͢༧ఆ • ։ൃڥͰDynamic FrameworkͷLinkʹࣦഊ͢Δ • swift-llbuild৮ͬͯΈΔ
Wormhole • ϥΠϒϥϦ࡞ͬͯexecutableͰ͏ࢀߟྫ • https://github.com/giginet/Wormhole • iOS Reject Conference Day1Ͱ͢༧ఆ
• https://iosdc-reject-conference.connpass.com/event/93314/
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠