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
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
550
15年メンテしてきたdotfilesから開発トレンドを振り返る 2011 - 2026
giginet
PRO
2
420
Claude Codeログ基盤の構築
giginet
PRO
7
4.5k
Inside of Swift Export
giginet
PRO
1
3.1k
Swiftビルド弾丸ツアー - Swift Buildが作る新しいエコシステム
giginet
PRO
0
2.8k
SwiftでMCPサーバーを作ろう!
giginet
PRO
3
460
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
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
370
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
240
テーブルをDELETEした
yuzneri
0
140
Foundation Models frameworkで画像分析
ryodeveloper
1
600
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
620
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.6k
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
150
Google Apps Script で Ruby を動かす
kawahara
0
140
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
210
What's New in Android 2026
veronikapj
0
250
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
4.1k
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
740
Featured
See All Featured
エンジニアに許された特別な時間の終わり
watany
108
250k
A better future with KSS
kneath
240
18k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.5k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
200
Unsuck your backbone
ammeep
672
58k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
280
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.3k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
210
Color Theory Basics | Prateek | Gurzu
gurzu
0
410
Designing Powerful Visuals for Engaging Learning
tmiket
1
480
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
Navigating Weather and Climate Data
rabernat
0
460
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/
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠