Slide 1

Slide 1 text

@giginet ৽͍͠Ϗϧυπʔϧ Scipioͷ͝঺հ potatotips #81 2023/2/21

Slide 2

Slide 2 text

୭ʁ • @giginet • LINEגࣜձࣾ Developer Experience։ൃνʔϜ • ex ΫοΫύουגࣜձࣾ ϞόΠϧج൫෦ • ٕज़ސ໰ • ϚωʔϑΥϫʔυ, peep, ϢϏϨδ • OSSϝϯςφ • Carthage, XcodeGen, fastlaneͳͲ • ࠷ۙ͸ϗάϫʔπϨΨγʔ΍ͬͯ·͢ • ྈ͸εϦβϦϯ

Slide 3

Slide 3 text

ϙέϞϯͰֶͿiOS 16஄ؙπΞʔ 🚅 https://speakerdeck.com/giginet/pokemondexue-buios-16dan-wan-tua potatotips #80

Slide 4

Slide 4 text

ࠓ೔࿩͢͜ͱ • ։ൃதͷϏϧυπʔϧScipioͷ͝঺հ • Swift Package͔ΒXCFrameworkΛ࡞Δ৽͍͠Ϗϧυπʔϧ • ؆୯ͳ࢖͍ํ • Ͳ͏΍ͬͯಈ͍͍ͯΔ͔؆୯ͳ֓ཁ

Slide 5

Slide 5 text

• Xcodeͷඪ४తͳύοέʔδ౷߹Ͱ͸ɺύοέʔδͷΩϟογϡʹ ໰୊͕͋Δ • Clean͢Δͱpurgeͨ͠Γͱ͔ŋŋŋŋŋŋ • ྫ͑͹ڊେͳϝοηʔδϯάΞϓϦͰࠔ͍ͬͯΔ • ύοέʔδ؅ཧͱXCFrameworkͷੜ੒ͷྑ͍ख๏͕ͳ͍ ͜Ε͸Կʁ

Slide 6

Slide 6 text

ྫ͑͹Carthage • XCFrameworkαϙʔτ͸͋Δ͕ŋŋŋŋŋŋ • Swift Packageͱͷޓ׵ੑ͕ͳ͘ɺύοέʔδ࡞ऀͷରԠ͕ඞཁ • ϝϯς͞Εͯͳͯ͘Φϫίϯ • Carhage͸໓Ϳ΂͖

Slide 7

Slide 7 text

https://github.com/Carthage/Carthage/releases/tag/0.39.0 • Φϫίϯ͗ͯ͢୭΋ϝϯςͯ͠ͳ͍ͷͰ๻͕ϦϦʔεͯ͠Δ • ઌ݄1೥൒ͿΓʹ৽όʔδϣϯ͕ग़·ͨ͠

Slide 8

Slide 8 text

Scipio - An awesome build tool - https://github.com/giginet/Scipio ͦ͜Ͱ

Slide 9

Slide 9 text

ͳʹ͕Ͱ͖Δͷʁ • Swift Package Manager(SwiftPM)ʹΑΔґଘղܾ • γϛϡϨʔλϏϧυɺStatic FrameworkαϙʔτɺσόοάγϯϘ ϧରԠ • ϚϧνϓϥοτϑΥʔϜରԠ • ϦιʔεόϯυϧରԠ • ΩϟογϡγεςϜ • Ϗϧυ͕ඞཁ͔൑அͯ͠ඞཁͳͱ͖͚ͩϦϏϧυ • ϦϞʔτΩϟογϡ • ύοέʔδຖͷϏϧυઃఆͷ஫ೖ

Slide 10

Slide 10 text

ಈ࡞ͷ࢓૊Έ • Swift Package Managerͷඪ४ػೳ Ͱґଘؔ܎ΛղܾɺύοέʔδΛ औಘ • औಘͨ͠ύοέʔδ͔Β XCFrameworkΛੜ੒ ґଘͷղܾ ύοέʔδͷऔಘ XCFrameworkͷϏϧυ

Slide 11

Slide 11 text

͔͍͔ͭͨ 1.ΞϓϦʹඞཁͳґଘؔ܎Λॻ͍ͨSwiftύοέʔδΛ༻ҙ 2.ScipioΛ࣮ߦ 3.XCFramework͕Ͱ͖Δ 🤗

Slide 12

Slide 12 text

// swift-tools-version: 5.7 import PackageDescription let package = Package( name: "Dependencies", platforms: [.iOS(.v13),], dependencies: [ .package(url: "https://github.com/apple/swift-log.git", from: "1.4.4"), .package(url: "https://github.com/apple/swift-collections.git", .upToNextMinor(from: "1.0.0")), ], targets: [ .target( name: "Dependencies", dependencies: [ .product(name: "Logging", package: "swift-log"), .product(name: "OrderedCollections", package: "swift-collections"), .product(name: "DequeModule", package: "swift-collections"), .product(name: "Collections", package: "swift-collections"), ]), ] ) ґଘؔ܎ͷఆٛ

Slide 13

Slide 13 text

$ scipio prepare /path/to/Dependencies 🔁 Resolving Dependencies... 🗑 Cleaning Dependencies... 📦 Building OrderedCollections for iOS 🚀 Combining into XCFramework... 📦 Building DequeModule for iOS 🚀 Combining into XCFramework... 📦 Building Collections for iOS 🚀 Combining into XCFramework... 📦 Building Logging for iOS 🚀 Combining into XCFramework... ❇ Succeeded. $ scipio prepareͷ࣮ߦ

Slide 14

Slide 14 text

͜Ε͚ͩͰ XCFramework͕Ͱ͖ͯ ✌ ࠷ߴ ✌

Slide 15

Slide 15 text

ΩϟογϡγεςϜ • ͢ͰʹϏϧυ͞Ε͍ͯΔύοέʔδ͕͋Ε͹ϏϧυεΩοϓ • VersionFileͱ͍͏ϏϧυઃఆΛอଘ͢Δ࢓૊ΈͰಉҰੑΛϏϧυ લʹ൑ఆ͍ͯ͠Δ $ scipio prepare /path/to/Dependencies 🔁 Resolving Dependencies... 🗑 Cleaning Dependencies... ✅ Valid OrderedCollections.xcframework is exists. Skip building. ✅ Valid DequeModule.xcframework is exists. Skip building. ✅ Valid Collections.xcframework is exists. Skip building. ✅ Valid Logging.xcframework is exists. Skip building. ❇ Succeeded.

Slide 16

Slide 16 text

ϦϞʔτΩϟογϡ • ϦϞʔτʹϏϧυࡁΈͷ XCFramework͕͋Ε͹Ϗϧυલʹ ෮ݩͰ͖Δ AwesomeKit.xcframework Destination Directory Remote object storage AAAAAA.xcframework BBBBBB.xcframework Restore 􀇃

Slide 17

Slide 17 text

https://speakerdeck.com/giginet/standardizing-build-system-using-modern-swift-packages-in-line Standardizing build system using modern Swift Packages in LINE 2022-11-10 Mobile DevOps Summit 2022 Kohki Miki (@giginet) LINE Corp Standardizing build system using modern Swift Packages in LINE Mobile DevOps Summit 2022 2022/11/10

Slide 18

Slide 18 text

ແݶʹωλ͕͋Δ͚ͲLT͡Ό଍Γͳ͍ ϦϞʔτΩϟογϡ Library EvolutionରԠ Resource BundleରԠ ΩϟογϡγεςϜ SwiftPM΁ͷߩݙ େن໛ϓϩδΣΫτͰͷӡ༻ ଞͷιϦϡʔγϣϯͱͷൺֱ XCFrameworkੜ੒ख๏ ClangλʔήοτରԠ

Slide 19

Slide 19 text

ࠓ೔͸ Ͳ͏΍ͬͯXCFrameworkΛ࡞ͬͯΔͷʁ ͱ͍͏࿩Λͪΐͬͱ͠·͢

Slide 20

Slide 20 text

چख๏ɿXcodeϓϩδΣΫτͷੜ੒ • ैདྷख๏ʢࠓ͸΍Ίͨʣ • Swift Package͔ΒxcodeprojΛੜ੒͠ ͯɺxcodebuildΛ࢖ͬͯXCFramework Λੜ੒ ґଘͷղܾ ύοέʔδͷऔಘ XcodeϓϩδΣΫτͷੜ੒ XCFrameworks swift package generate-xcodeproj xcodebuild swift package resolve

Slide 21

Slide 21 text

• Swift Package͔ΒxcodeprojΛੜ੒ͯ͘͠ΕΔSwiftPMͷඪ४ػೳ • ͔͠͠௕Β͘ϝϯς͞Ε͍ͯͳͯ͘ඇਪ঑ɺϦιʔεόϯυϧͳͲ ʹରԠ͍ͯ͠ͳ͍ • ઌिग़ͨXcode 14.3(Swift 5.8)͔Β׬શʹ࡟আ 😇 $ swift package —help SUBCOMMANDS: generate-xcodeproj Generates an Xcode project. This command will be deprecated soon. See 'swift help package ' for detailed help. $ swift package generate-xcodeproj

Slide 22

Slide 22 text

Project Generatorͷखಈੜ੒ • generate-xcodeprojΛಠ࣮ࣗ૷ • SwiftPMͷඪ४ػೳΛ࢖ͬͯPackage ManifestΛύʔε • tuist/XcodeProjͳͲͷαʔυύʔςΟϥΠϒϥϦΛ࢖ͬͯ xcodeprojΛੜ੒ • generate-xcodeproj͕ରԠ͍ͯ͠ͳ͍ػೳ΋ಠ࣮ࣗ૷ • ͋Δఔ౓͸ϫʔΫ͕ͨ͠ίʔυྔ͕ଟ͗ͯ͢อकੑ͕ࢮ๢ 🔥 • https://github.com/giginet/Scipio/pull/10

Slide 23

Slide 23 text

৽ख๏ɿPIFͱxcbuildͷར༻ʢݱঢ়ʣ • The Project Interchange Format (PIF)ͱ ͍͏SwiftPM಺෦ͷ࢓૊ΈΛ࢖͍ͬͯΔ • https://github.com/apple/swift-package-manager/blob/main/ Sources/XCBuildSupport/PIF.swift • SwiftPM͕Xcodeͱ΍ΓͱΓ͢ΔͨΊͷ σʔλߏ଄(JSON) • xcodeprojͷΑ͏ͳσʔλߏ଄Λ࣋ͬͯ ͍Δ • swift package dump-pif Ͱੜ੒Ͱ͖Δ ґଘͷղܾ ύοέʔδͷऔಘ PIFͷੜ੒ XCFrameworkͷϏϧυ swift package dump-pif xcbuild swift package resolve

Slide 24

Slide 24 text

[ { "contents" : { "guid" : "Workspace:/Users/giginet/.ghq/github.com/apple/swift-log@11", "name" : "swift-log", "path" : "/Users/giginet/.ghq/github.com/apple/swift-log", "projects" : [ "5efb5ae893d8ac787311a46da9406baa3bce845cbce481fdb94390442801fdb3", "9ab62105dad5328dc9d5a3cef4fc26bf52108b7ac1a4beec01d32ce8968f16c3", "0e8bd1af969fb95dc35d81c26beebbf9926c0b251db8863ded809faa315c9e65", "7af763f6bfb93ee07e17424e201c80920f6427b4350a7daf1bc6c63601a082a9" ] }, "signature" : "af4193bb1b6197ade0b9afc08ffece572cbe5c60919c89b2b0953025848a2a67", "type" : "workspace" }, { "contents" : { "buildConfigurations" : [ { "buildSettings" : { "CLANG_ENABLE_OBJC_ARC" : "YES", "CODE_SIGN_IDENTITY" : "", "CODE_SIGNING_REQUIRED" : "NO", "COPY_PHASE_STRIP" : "NO", "DEBUG_INFORMATION_FORMAT" : "dwarf", "DRIVERKIT_DEPLOYMENT_TARGET" : "19.0", "DYLIB_INSTALL_NAME_BASE" : "@rpath", "ENABLE_NS_ASSERTIONS" : "YES", "ENABLE_TESTABILITY" : "YES", "ENABLE_TESTING_SEARCH_PATHS" : "YES", "ENTITLEMENTS_REQUIRED" : "NO", "FRAMEWORK_SEARCH_PATHS[__platform_filter=ios;ios-simulator]" : [ "$(inherited)", "$(PLATFORM_DIR)/Developer/Library/Frameworks" ], "FRAMEWORK_SEARCH_PATHS[__platform_filter=macos]" : [

Slide 25

Slide 25 text

$ XCBUILD=/Applications/Xcode.app/Contents/SharedFrameworks/ XCBuild.framework/Versions/A/Support/xcbuild $ ./xcbuild dumped-pif.json -con f iguration release -target Logging • swift build —build-system xcode • ͜ͷͱ͖ɺSwiftPM͸ɺxcbuildͱ͍͏Xcodeͷ࣋ͭexecutableʹPIF Λ౉͍ͯ͠Δ • https://github.com/apple/swift-package-manager/blob/main/Sources/XCBuildSupport/XcodeBuildSystem.swift PIFͱxcbuild • PIFΛฤूͯ͠ϏϧυઃఆΛ࿔Ε͹͜ΕͰϏϧυͰ͖ΔͷͰ͸ʁ • →Ͱ͖ͨ 🎉

Slide 26

Slide 26 text

࣍ճ༧ࠂ • ϚδͰࢿྉ΋ͳ͍࣌ؒ͠΋ͳ͍ͷͰࠓ೔͸͜͜·Ͱ • ࣍ճͲ͔ͬͰ࿩͔͢΋ • Θ͍Θ͍swiftcͱ͔ • ΄͔ͷΧϯϑΝϨϯεͱ͔ • ࠙਌ձͰฉ͍͍ͯͩ͘͞

Slide 27

Slide 27 text

ScipioϓϩδΣΫτͷݱঢ় • ࠷৽൛Ͱ͸ଟ͘ͷύοέʔδ͕XCFrameworkԽͰ͖ΔΑ͏ʹ 🎉 • swift-nio, firebase-ios-sdk, RxSwiftͳͲ • Ұ෦SwiftPMͷfork͕ඞཁͰɺݱঢ়upstreamʹରͯ͠PRૹͬͨΓ͠ ͍ͯͯϦϦʔεͰ͖͍ͯͳ͍ͷͰਖ਼ࣜϦϦʔεΛ͓଴͍ͪͩ͘͞ • 2023/2/21ݱࡏɺࢼ͍ͨ͠ํ͸͜ͷPR͕࠷৽൛Ͱ͢ • https://github.com/giginet/Scipio/pull/51

Slide 28

Slide 28 text

·ͱΊ • Scipio͸։ൃதͰͦͷ͏ͪͪΌΜͱ͓൸࿐໨Ͱ͖ͦ͏ͳͷͰڵຯ͕͋Ε͹ͥͻ • େن໛ϓϩδΣΫτͰӡ༻࣮ͯ͠༻ஈ֊ʹ͍ͨ͠ • ଓ͖͸Ͳ͔͜ͷΧϯϑΝϨϯεͰ࿩͍ͨ͠ • ͍͔ͭ͘ւ֎ΧϯϑΝϨϯεʹCfPΛग़͍ͯ͠ΔͷͰͦͷ͏ͪ࿩͔͢΋ • Ͳ͏ͧ͝ظ଴͍ͩ͘͞ • https://github.com/giginet/Scipio • ελʔ͍ͩ͘͞ ⭐

Slide 29

Slide 29 text

͝ਗ਼ௌ ͋Γ͕ͱ͏ ͍͟͝·ͨ͠