Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
わいわいSwift Package Manager
Search
giginet
PRO
September 12, 2018
Programming
700
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
580
15年メンテしてきたdotfilesから開発トレンドを振り返る 2011 - 2026
giginet
PRO
2
480
Claude Codeログ基盤の構築
giginet
PRO
7
4.7k
Inside of Swift Export
giginet
PRO
1
3.5k
Swiftビルド弾丸ツアー - Swift Buildが作る新しいエコシステム
giginet
PRO
0
2.9k
SwiftでMCPサーバーを作ろう!
giginet
PRO
3
480
Creating Intuitive Developer Tool in Swift
giginet
PRO
0
1.7k
Mergeable Libraryで 高速なアプリ起動を実現しよう!
giginet
PRO
2
8.5k
5分でわかるExplicitly Built Modules
giginet
PRO
2
1.9k
Other Decks in Programming
See All in Programming
巨大モノリシックアプリ モダン化大作戦
ktcryomm
1
1k
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
340
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
720
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
290
一人だけ、Kiroが静止する日
hideg
0
110
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
150
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
410
アクセシビリティから考える情報設計
high_g_engineer
0
380
Intent as Code
shoppingjaws
6
1k
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
1
280
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
240
XHTMLが残したもの
yosuke_furukawa
PRO
2
810
Featured
See All Featured
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
WENDY [Excerpt]
tessaabrams
14
39k
Designing Powerful Visuals for Engaging Learning
tmiket
1
560
How to Ace a Technical Interview
jacobian
281
24k
A Soul's Torment
seathinner
8
3.6k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
30 Presentation Tips
portentint
PRO
1
400
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
580
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Done Done
chrislema
186
16k
Being A Developer After 40
akosma
91
590k
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/
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠