$30 off During Our Annual Pro Sale. View Details »

Swift Packageを使った 巨大な依存グラフのキャッシュ戦略

giginet
PRO
September 01, 2023

Swift Packageを使った 巨大な依存グラフのキャッシュ戦略

giginet
PRO

September 01, 2023
Tweet

More Decks by giginet

Other Decks in Programming

Transcript

  1. • @giginet

    • LINEגࣜձࣾ Developer Experience Team(2022/7~)

    • ٕज़ސ໰

    • גࣜձࣾϚωʔϑΥϫʔυ

    • גࣜձࣾϢϏϨδ

    • Core Committer

    • XcodeGen/fastlane/Carthage …

    • iOSDCొஃ2೥ͿΓ6ճ໨ (2017(LT), 18(30min), 19(LT), 21(40min))
    ͜Μʹͪ͸

    View Slide

  2. 2023/09/01 iOSDC 2023 Day 0
    Swift PackageΛ࢖ͬͨ
    ڊେͳґଘάϥϑͷΩϟογϡઓུ
    @giginet

    View Slide

  3. ࠓ೔࿩͢͜ͱ
    1
    2
    3
    LINEΞϓϦͷϏϧυ؀ڥͷ঺հ
    Swift PackageΛΩϟογϡՄೳʹ͢Δख๏ͷ঺հ
    LINEΞϓϦͷϏϧυ؀ڥΛͲ͏վળ͔ͨ͠
    ೖࣾ࣌(2022/7)ʹ௚໘ͨ͠਺ʑͷ໰୊఺ !
    ৽͍͠ϏϧυπʔϧScipioͷ঺հ
    ґଘؔ܎ͷϏϧυ͕ཁΒͳ͍ੈքʹ
    ͳͥύοέʔδͷΩϟογϡ͕ඞཁʹͳͬͨͷ͔
    Swift PackageΛ࠶഑෍Մೳʹѻ͏ͨΊʹ

    View Slide

  4. ֶ΂Δ͜ͱ
    • େن໛ϓϩδΣΫτͷϏϧυ؀ڥͷέʔεελσΟ

    • Ϗϧυπʔϧͷ಺෦ಈ࡞

    • Swift Package Managerͷ֤छػೳ΍Ϗϧυઃఆ

    • XCFrameworkͷ࢓૊Έ΍ߏ଄

    • ϦϞʔτΩϟογϡπʔϧͷߏஙΞΠσΟΞ

    View Slide

  5. LINE iOSΞϓϦϏϧυ؀ڥͷ՝୊
    ୈ1ষ

    View Slide

  6. View Slide

  7. ϓϩδΣΫτ͕σΧ͍

    View Slide

  8. LINEϓϩδΣΫτͷ։ൃن໛(2023/8)
    ίʔυߦ਺ 200ສߦҎ্
    XcodeϓϩδΣΫτ਺ 300Ҏ্
    ϏϧυࡁΈϑϨʔϜϫʔΫ਺ 150Ҏ্

    View Slide

  9. Bazel Xcode
    ΞϓϦέʔγϣϯϏϧυ
    LINE iOSͷϏϧυϓϩηε(~2022)
    PrebuiltλεΫ
    STEP 1 STEP 2

    View Slide

  10. Bazel Xcode
    ΞϓϦέʔγϣϯϏϧυ
    LINE iOSͷϏϧυϓϩηε(~2022)
    PrebuiltλεΫ
    STEP 1 STEP 2

    View Slide

  11. Bazel Xcode
    ΞϓϦέʔγϣϯϏϧυ
    LINE iOSͷϏϧυϓϩηε(~2022)
    PrebuiltλεΫ
    STEP 1 STEP 2

    View Slide

  12. Bazel
    PrebuiltλεΫ
    PrebuiltλεΫ
    • OSSϥΠϒϥϦͷFrameworkԽ

    • ࣾ಺࣮૷ͷFrameworkԽ

    • όΠφϦϑϨʔϜϫʔΫͷऔಘ

    • APIεΩʔϜ͔Βͷίʔυੜ੒
    STEP 1

    View Slide

  13. Bazelͱ͸
    • Googleͷ։ൃͨ͠Ϗϧυπʔϧ

    • Ϗϧυͷ࠶ݱੑΛҡ࣋ͨ͠··ɺߴ଎ͳϏϧυύΠϓϥΠϯΛߏஙͰ͖Δ

    • https://bazel.build/?hl=ja

    View Slide

  14. Bazel
    PrebuiltλεΫ
    PrebuiltλεΫ
    • OSSϥΠϒϥϦͷFrameworkԽ

    • ࣾ಺࣮૷ͷFrameworkԽ

    • όΠφϦϑϨʔϜϫʔΫͷऔಘ

    • APIεΩʔϜ͔Βͷίʔυੜ੒
    STEP 1

    View Slide

  15. Xcode
    ΞϓϦέʔγϣϯϏϧυ
    ΞϓϦέʔγϣϯϏϧυ
    • XCWorkspace + ෳ਺(100~)ͷxcodeprojͰߏ੒

    • XcodeGenͰ֤ϓϩδΣΫτੜ੒

    • PrebuiltλεΫͰ࡞੒ͨ͠ϑϨʔϜϫʔΫΛ౷߹
    STEP 2

    View Slide

  16. BazelͷಋೖͱϏϧυ଎౓
    • ๲େͳίʔυϕʔεʹΑΓϏϧυ଎౓͕໰୊ʹ

    • 2019೥ࠒ͔ΒͷBazelͷಋೖʹΑΓɺҰ࣌͸Ϗϧυ଎౓͕଎͘ͳͬͨ "

    View Slide

  17. BazelͷಋೖͱϏϧυ଎౓
    ͕
    ࣍ୈʹϝϯςίετͷํ͕ॏ͘ͳͬͨ
    • ๲େͳίʔυϕʔεʹΑΓϏϧυ଎౓͕໰୊ʹ

    • 2019೥ࠒ͔ΒͷBazelͷಋೖʹΑΓɺҰ࣌͸Ϗϧυ଎౓͕଎͘ͳͬͨ "

    View Slide

  18. -*/&J04
    Ϗϧυ؀ڥͷมભ
    (JVL+VOH
    -*/&1MBUGPSN%FW$FOUFS
    %FWFMPQFS&YQFSJFODF5FBN
    LINE iOS Ϗϧυ؀ڥͷมભ
    iOSDC 2022 εϙϯαʔηογϣϯ
    https://speakerdeck.com/line_developers/changes-in-line-ios-build-environment

    View Slide

  19. LINE͸ͳͥBazelΛ࢖Θͳ͍͜ͱʹͨ͠ͷ͔ʁ
    https://engineering.linecorp.com/ja/blog/line-bazel

    View Slide

  20. ՝୊ -BazelͷϝϯςφϏϦςΟ-
    • BazelͰͷϏϧυύΠϓϥΠϯߏஙͷֶश
    ίετ͕ߴ͍

    • ਂࠁͳBazel৬ਓͷޙܧऀෆ଍(Starlark)

    • ςετ͕ͳ͍ಠࣗRule

    • Bazelͷόʔδϣϯ͕ݹ͍··਺೥์ஔ

    • ࠷ۙΑ͏΍ͬͱ্͛ͨ

    • fork·Ͱͯͨ͠ͷͰ࠷ۙফͨ͠

    View Slide

  21. ՝୊ -ίʔυϕʔεͷ౷߹ํ๏-
    • ίʔυͷऔಘ͸BazelΛ࢖͏͔submodule

    • େྔͷsubmodule͕ൃੜ

    • සൟʹϦϏδϣϯ͕ζϨͯେม

    View Slide

  22. ՝୊ -BUILDϑΝΠϧͷఆٛ-
    • ֤ґଘʹରͯ͠BUILDϑΝΠϧͷఆ͕ٛඞཁ

    • podspec΍Package.swiftͷΑ͏ͳ΋ͷ

    • ϚχϑΣετͷมߋʹ௥ै͍ͯ͘͠ඞཁ͕͋
    ΓɺΞοϓσʔτ͕େม

    View Slide

  23. ՝୊ -όʔδϣϯϦκϧό͕ͳ͍-
    • όʔδϣϯϦκϧό͕ͳ͍

    • ґଘؔ܎ͷղܾ͕ਓྗ

    • ґଘ͕ґଘΛؚΉ৔߹ͷղܾ͕೉͍͠
    http_archive(
    name = "APIKit",
    build_file = "//Configuration/repositories:APIKit.BUILD",
    sha256 =
    "0d19ebb5769ca464c7b10671ca1df21b8e9edad198f59e2d854c48cc580383
    43",
    strip_prefix = "APIKit-5.0.0",
    url = "https://github.com/ishkawa/APIKit/archive/
    5.0.0.tar.gz",
    )
    http_archive(
    name = "APNGKit",
    build_file = "//Configuration/repositories:APNGKit.BUILD",
    sha256 =
    "89245edaabcda2872141ecfcfad6d88fa5f0293af52a4cbcd2dd2fd6e3f931
    99",
    strip_prefix = “APNGKit-2.2.1”,
    url = “https://github.com/onevcat/APNGKit/archive/
    2.2.1.tar.gz”,
    )

    View Slide

  24. ՝୊ -Xcodeͱͷ࿈ܞෆඋ-
    • ඪ४ػೳͷར༻͕೉͍͠

    • σόοΨɺิ׬ɺίʔυδϟϯϓ

    View Slide

  25. Ϗϧυ؀ڥ͕ϝϯς͞Εͣʹ
    ෛ࠴Խ

    View Slide

  26. LINE iOSʹ͓͚ΔBazelͷޭࡑ
    • ͔֬ʹϏϧυ͸ૣ͘ͳ͕ͬͨŋŋŋŋŋŋ

    • ϝϯςφϯείετͷ૿େ

    • ֶशίετͷߴ͞ɺϏϧυઃఆͷෳࡶ͞

    • ඪ४؀ڥͱ཭ΕΔ͜ͱͷσϝϦοτ

    • ৽ػೳ௥ैʹ͕͔͔࣌ؒΔ(Xcode Beta, Apple Silicon etc…)

    • Apple Siliconͷొ৔ͰϝϦοτ͕ݶఆతʹ

    • Bazel͸ܶༀͩͬͨ

    View Slide

  27. ͓͜ͱΘΓ
    • Bazelͷར༻ʹΑΓϏϧυ࣌ؒʹޮՌ͕͋ͬͨͷ͸ࣄ࣮

    • BazelίϛϡχςΟʹΑΔiOSαϙʔτ͸ੵۃతʹଓ͍͍ͯΔ

    • rules_apple, rules_ios, rules_swift_package_manager, rules_xcodeprojͳͲ

    • େن໛ϓϩδΣΫτʹΑΔ࢖༻࣮੷΋ଟ͍

    • BazelΛܧଓతʹϝϯςͰ͖ΔͷͰ͋Ε͹༗༻

    • LINEͰ͸ద੾ʹӡ༻Ͱ͖ͳ͔ͬͨ

    View Slide

  28. ৽ͨͳཁٻ
    • ͱʹ͔͘ඪ४ͷϏϧυγεςϜΛ࢖͍͍ͨ

    • Ϗϧυ੒Ռ෺͕࠶ར༻Ͱ͖ͯΩϟογϡ͠΍͍͢

    • ։ൃ͠΍͘͢ςετ͠΍͍͢

    • ґଘؔ܎ͷΞοϓσʔτ͕͠΍͍͢

    View Slide

  29. https://developer.apple.com/videos/play/wwdc2019/103/?time=1302
    WWDC19 Platform State of the Union
    Swift Package

    View Slide

  30. Swift Package + Xcode
    • Xcodeඪ४ͷSwift Package Manager͸࠷ߴͷղܾࡦ
    • ͜Ε͕࢖͑ΔͳΒ͹͜ΕΛ࢖͏΂͖

    View Slide

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

    View Slide

  32. Swift Package + Xcode
    • Xcodeඪ४ͷSwift Package Manager͸࠷ߴͷղܾࡦ
    • ͜Ε͕࢖͑ΔͳΒ͹͜ΕΛ࢖͏΂͖

    • ͔͠͠ɺLINEΞϓϦͷن໛ + ϓϩδΣΫτߏ੒Ͱ͸ඪ४ػೳ͚ͩͰ͸೉͍͠

    View Slide

  33. Ωϟογϡػߏͷෆ଍
    • Swift Packageͷ੒Ռ෺͕شൃ͠΍͍͢

    • DerivedDataʹอଘ

    • →100Λӽ͑Δґଘؔ܎ͷΩϟογϡʹ͸ෆద

    View Slide

  34. ෳ਺ͷxcodeproj͔Βͷར༻ͷ೉͠͞
    • LINE iOSϓϩδΣΫτ͸xcworkspaceʹ਺ඦͷxcodeprojΛ౷߹͍ͯ͠Δ

    • ͜ͷϓϩδΣΫτߏ੒ͰXcodeඪ४ͷSwift Package౷߹Λ࢖͏ͷ͸೉͍͠

    View Slide

  35. ཧ૝
    1. SwiftPMʹΑΔSwift Packageͷґଘղܾͱऔಘ
    2. Ϗϧυ੒Ռ෺ΛΩϟογϡɺڞ༗ɺ࠶ར༻
    3. XcodeϓϩδΣΫτ͔Βͷར༻

    View Slide

  36. Scipio
    - An awesome build tool -
    https://github.com/giginet/Scipio

    View Slide

  37. ৽͍͠Ϗϧυπʔϧ
    Scipioͷ঺հ
    ୈ2ষ

    View Slide

  38. Scipio
    • SwiftPMΛར༻ͯ͠XCFrameworkΛੜ੒͢ΔϏϧυπʔϧ

    • Swift PackageΛ࠶഑෍Մೳͳܗʹม׵ͯ͠ѻ͑Δ

    • ओͳػೳ

    • Ϧιʔεόϯυϧͷαϙʔτ

    • Static/Dynamic Frameworkͷੜ੒

    • ϦϞʔτΩϟογϡγεςϜ

    View Slide

  39. XCFrameworkͱ͸
    • Apple͕։ൃͨ͠ϏϧυࡁΈϥΠϒϥϦΛ഑෍͢ΔͨΊͷܗࣜ

    • WWDC19Ͱൃද

    • ैདྷͷ Frameworkʹൺ΂ͯෳ਺ͷϓϥοτϑΥʔϜ޲͚ͷόΠφϦΛಉ࣌ʹ
    ഑෍Ͱ͖Δ

    • ࣮ଶ͸ͨͩͷσΟϨΫτϦʢBundleʣ

    • ෳ਺ͷϓϥοτϑΥʔϜͷFrameworkΛ֨ೲ͍ͯ͠Δ

    View Slide

  40. MyFramework.xcframework
    Info.plist
    ios-arm64
    ios-arm64_x86_64-simulator
    MyFramework.framework
    MyFramework.framework
    σΟϨΫτϦ
    ϝλσʔλ
    ϓϥοτϑΥʔϜɺΞʔΩςΫνϟ
    Framework

    View Slide

  41. Scipioͷಈ࡞ͷྲྀΕ
    • SwiftPMͰύοέʔδϚχϑΣετ͔Βґ
    ଘؔ܎Λղܾ

    • ύοέʔδ͔ΒXCFrameworkΛੜ੒
    Package.swiftͷresolve
    Swift PackageͷϏϧυ
    XCFrameworkͷੜ੒

    View Slide

  42. ྫ͑͹Carthage
    • Carthage/Carthage

    • ࿝ฮͷύοέʔδϚωʔδϟʔ

    • XCFrameworkαϙʔτ͸͋Δ͕

    • ϥΠϒϥϦ࡞ऀ͕xcodeprojΛઃஔ͢Δඞཁ͕͋Δ

    • ࠷ۙ͸ରԠ͠ͳ͍ϥΠϒϥϦ͕΄ͱΜͲ

    • ϝϯς͕ࢭ·͍ͬͯΔ

    View Slide

  43. View Slide

  44. Scipio
    - An awesome build tool -
    https://github.com/giginet/Scipio

    View Slide

  45. ୈ2ষͰ࿩͢͜ͱ
    • Scipioͷ঺հͱ࢓૊Έ

    • ར༻ํ๏

    • ΩϟογϡγεςϜ

    • ϑϨʔϜϫʔΫੜ੒ͷํ๏

    • ੜ੒ख๏ͷ঺հ

    • ϑϨʔϜϫʔΫͷߏ଄

    • ੜ੒࣌ͷ໰୊఺ͱରࡦ

    View Slide

  46. Scipioͷಈ࡞Ϟʔυ
    • prepareϞʔυ

    • ΞϓϦέʔγϣϯʹ࢖͏ґଘؔ܎Λهड़ͯ͠·ͱΊͯϏϧυ

    • createϞʔυ

    • ୯ମͷSwift Package͔ΒXCFrameworkΛੜ੒

    View Slide

  47. 1. ύοέʔδϚχϑΣετͷఆٛ
    // 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"),
    ]),
    ]
    )
    Ϗϧυର৅ͷϓϥοτϑΥʔϜ
    ύοέʔδ
    Ϗϧυ͢Δλʔήοτ

    View Slide

  48. 2. prepareίϚϯυͷ࣮ߦ
    $ 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.

    View Slide

  49. View Slide

  50. createϞʔυ
    $ scipio create path/to/swift-log —platforms iOS —support-simulators
    # Resolving Dependencies...
    % Building Logging for iOS, iPhone Simulator
    & Combining into XCFramework...
    ❇ Succeeded.
    • SwiftPMͰύοέʔδϚχϑΣετ͔Βґଘؔ܎Λղܾ

    • ύοέʔδ͔ΒXCFrameworkΛੜ੒

    View Slide

  51. https://giginet.github.io/Scipio/documentation/scipio
    ৄ͘͠͸DocC

    View Slide

  52. ΩϟογϡγεςϜ

    View Slide

  53. ScipioͷΩϟογϡγεςϜ
    • Scipio͸ΩϟογϡγεςϜΛඋ͍͑ͯΔ

    • prepareϞʔυ͸ੜ੒ࡁΈͷ੒Ռ෺͕͋Ε͹࠶ར༻͕Ͱ͖Δ
    $ 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.
    ੜ੒ࡁΈͷϑϨʔϜϫʔΫ͸
    ࠶ར༻͞ΕΔ

    View Slide

  54. VersionFile
    • VersionFileͱ͍͏ϏϧυίϯςΩετΛؚΜͩJSONϑΝΠϧΛੜ੒

    • Ϗϧυલʹ͜Ε͔ΒϏϧυ͢ΔύοέʔδͱɺϏϧυࡁΈ੒Ռ෺ͷಉҰੑΛ
    νΣοΫ

    • ಉҰͷ΋ͷ͕͋Ε͹ΩϟογϡΛར༻ͯ͠Ϗϧυ
    MyFramework.xcframework
    .MyFramework.version

    View Slide

  55. {
    "buildOptions" : {
    "buildConfiguration" : "debug",
    "enableLibraryEvolution" : false,
    "extraBuildParameters" : {
    "COPY_PHASE_STRIP" : "NO",
    "SWIFT_OPTIMIZATION_LEVEL" : "-Onone"
    },
    "frameworkType" : "static",
    "isDebugSymbolsEmbedded" : true,
    "sdks" : [
    "iOS",
    "iOSSimulator",
    "watchOS",
    "watchOSSimulator"
    ]
    },
    "clangVersion" : "clang-1403.0.22.14.1",
    "pin" : {
    "revision" : "32e8d724467f8fe623624570367e3d50c5638e46",
    "version" : "1.5.2"
    },
    "scipioVersion" : "9456405b33f2a25c479ea31cad0ba3c0222d9e20",
    "targetName" : "Logging"
    }

    View Slide

  56. ProjectΩϟογϡ
    • ग़ྗઌσΟϨΫτϦͷΈΛΩϟογϡͱ
    ͯ͠ѻ͏ϙϦγʔ

    • ग़ྗઌͷXCFramework͕͜Ε͔ΒϏϧυ
    ͢Δ΋ͷͱಉҰͳΒ͹εΩοϓ
    MyFramework.xcframework
    .MyFramework.version
    XCFrameworks

    View Slide

  57. Local DiskΩϟογϡ
    • γεςϜΩϟογϡσΟϨΫτϦ(~/
    Library/Cache)ʹ੒Ռ෺Λ଴ආ

    • Ϗϧυ࣌ʹVersionFileͷϋογϡ͔
    ΒΩϟογϡ͕͋Ε͹෮ݩ

    • ಉ͡Ϛγϯ಺ͰաڈʹϏϧυͨ͠
    ͜ͱ͕͋Δ੒Ռ෺Λ࢖͍ճͤΔ

    • ෳ਺ͷXcodeόʔδϣϯͷ੾Γସ
    ͑࣌΍ϒϥϯνͷ੾Γସ͑࣌ʹ༗
    ༻ MyFramework.xcframework
    XCFrameworks
    γεςϜΩϟογϡσΟϨΫτϦ
    6cc7dbe.xcframework
    17aef70.xcframework
    ෮ݩ

    View Slide

  58. Remote DiskΩϟογϡ
    • Local Disk CacheΛϦϞʔτσΟε
    Ϋʹ֦ு

    • ։ൃऀؒͰΩϟογϡͷ࠶ར༻͕Մ
    ೳʹ

    • Amazon S3༻ͷόοΫΤϯυΛఏڙ
    MyFramework.xcframework
    XCFrameworks
    ϦϞʔτΦϒδΣΫτετϨʔδ
    ෮ݩ
    !
    6cc7dbe.xcframework
    17aef70.xcframework

    View Slide

  59. XCFrameworkͷੜ੒ख๏

    View Slide

  60. swift-create-xcframework
    • unsignedapps/swift-create-xcframework

    • SwiftPM͔ΒXCFrameworkΛ࡞੒͢Δπʔϧ

    • ScipioͷcreateϞʔυʹ͍ۙ

    • xcodeprojΛੜ੒͠ɺxcodebuildͰϏϧυ͍ͯ͠Δ

    • xcodeprojͷੜ੒ʹ͸generate-xcodeprojͱ͍͏SwiftPMͷαϒίϚϯυΛ
    ࢖͍ͬͯΔ

    View Slide

  61. چख๏ɿxcodeprojΛ࢖ͬͨFrameworkੜ੒
    • SwiftPM͔ΒxcodeprojΛੜ੒ˠxcodebuildͰϏϧυ

    • SwiftPMʹ͸xcodeprojΛੜ੒͢ΔίϚϯυ͕෇ଐ͠
    ͍ͯΔ
    $ swift package generate-xcodeproj
    generate-xcodeproj
    xcodebuild

    View Slide

  62. چख๏ɿxcodeprojΛ࢖ͬͨFrameworkੜ੒
    • SwiftPM͔ΒxcodeprojΛੜ੒ˠxcodebuildͰϏϧυ

    • SwiftPMʹ͸xcodeprojΛੜ੒͢ΔίϚϯυ͕෇ଐ͠
    ͍ͯΔ

    • →͕ɺSwift 5.8(Xcode 14.0)͔Β࡟আ
    $ swift package generate-xcodeproj
    generate-xcodeproj
    xcodebuild

    View Slide

  63. ఏҊख๏ɿPIFΛ࢖ͬͨFrameworkੜ੒
    • PIFͱݺ͹ΕΔ಺෦දݱΛར༻ͯ͠ϑϨʔϜϫʔΫ
    Ϗϧυ͢Δख๏

    • Scipio͸SwiftPM͕ੜ੒͢ΔPIFΛదٓॻ͖׵͑
    ͯϑϨʔϜϫʔΫΛੜ੒͍ͯ͠Δ dump-pif
    xcodebuild

    View Slide

  64. PIF(The Project Interchange Format)
    • SwiftPM͕ϏϧυγεςϜͱ௨৴͢ΔͨΊͷϑΥʔϚοτ

    • ࣮ଶ͸JSON

    • xcodeprojͷߏ଄ʹࠅࣅ

    • SwiftPMͷαϒίϚϯυͰੜ੒ग़དྷΔ
    $ swift package dump-pif
    dump-pif
    xcodebuild

    View Slide

  65. [
    {
    "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" : [
    "c44c70d170d7f592dc973df88b2326051b86b7958e1560c32c2b31d19fb714aa",
    "939870cd480866e3c56cbb743773b1add4e3a3d79277ede53c31eb6377cbea92",
    "024e214b7e54ed6ea3153ebf0698b3ab88ca40336b27bc1c9dbdb39d2d261ccf"
    ]
    },
    "signature" : "35c4ad5e4b5e02d91fb54f4805e7aed41ba7f21d782e1622519ee2cd2b8980e4",
    "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]" : [
    "$(inherited)",
    XCConfigΈ͍ͨͳͷ͕ຒ·ͬͯΔ

    View Slide

  66. PIFΛ࢖ͬͨύοέʔδͷϏϧυ
    • ύοέʔδͷϏϧυʹXcodeΛ࢖͏ϞʔυΛબ΂Δ

    • SwiftPM͕಺෦తʹPIFΛੜ੒͠ɺXcodeʹ౉ͯ͠ύοέʔδΛϏϧυ
    $ swift build --build-system xcode

    View Slide

  67. XCBuild
    • Xcode΍xcodebuild͕಺෦Ͱར༻͍ͯ͠ΔϏϧυπʔϧΒ͍͠

    • XcodeͷToolchainʹ෇ଐ͍ͯ͠Δ

    • Ҿ਺ʹPIFΛ౉͢ͱ͔ͦ͜ΒϏϧυͯ͘͠ΕΔ
    $ export xcbuild=/Applications/Xcode.app/Contents/
    SharedFrameworks/XCBuild.framework/Versions/A/Support/
    xcbuild
    $ xcbuild build my-package.pif \
    --target MyPackage \
    --derivedDataPath ./build/scipio

    View Slide

  68. XCFrameworkͷੜ੒
    • xcodebuildͷ-create-xcframeworkίϚϯυͰͰ͖Δ

    • ෳ਺ͷFrameworkΛ౉ͯ͠౷߹͢Δ͚ͩ

    • https://help.apple.com/xcode/mac/11.0/#/dev544efab96
    $ xcodebuild -create-xcframework \
    -framework Release-iphoneos/MyPackage.framework \
    -framework Release-iphonesimulator/MyPackage.framework \
    -output MyFramework.xcframework

    View Slide

  69. ϑϨʔϜϫʔΫͷߏ଄ͱ՝୊

    View Slide

  70. ϑϨʔϜϫʔΫͷߏ଄ͱ՝୊
    • Frameworkͷछྨͱ՝୊

    • Swiftλʔήοτ

    • Library Evolutionͷ੍໿

    • Clangλʔήοτ

    • ϔομʔߏ଄ͷ໰୊

    • Ϧιʔεαϙʔτͷ࢓૊Έ

    View Slide

  71. Swiftλʔήοτ
    • SwiftͷΈͰߏ੒͞Εͨλʔήοτ

    • ΄ͱΜͲͷ৔߹ɺ؆୯ʹϑϨʔϜϫʔΫԽͰ͖Δ

    • Ұ෦ͦΕ͚ͩͰ͸ϏϧυͰ͖ͳ͍ྫ͕͋Δʢޙड़ʣ

    View Slide

  72. MyFramework.framework
    MyFramework
    Info.plist ϝλσʔλ
    Modules
    MyFramework.swiftmodule
    ΠϯλʔϑΣΠεެ։͢ΔόΠφϦΛ࣋ͭ
    ʢswiftmoduleʣ
    ϥΠϒϥϦຊମ

    View Slide

  73. Library Evolution
    • ϏϧυࡁΈͷϑϨʔϜϫʔΫΛSwiftόʔδϣϯʹΑΒͣʹ࢖͑ΔΑ͏ʹ͢Δ
    ࢓૊ΈʢABI Stabilityʣ

    • https://www.swift.org/blog/library-evolution/

    • BUILD_LIBRARY_FOR_DISTRIBUTIONΛ༗ޮԽ͢Δͱੜ੒

    • Frameworkʹswiftinterfaceͱ͍͏ఆ͕ٛੜ੒͞ΕΔ

    • ࣮ଶ͸ςΩετϑΝΠϧ

    View Slide

  74. MyFramework.framework
    MyFramework
    Info.plist
    swiftinterface
    ίϯύΠϥόʔδϣϯʹدΒͣޓ׵͕อͨΕΔΠϯλʔϑΣΠε
    Modules
    MyFramework.swiftmodule
    MyFramework.swiftinterface

    View Slide

  75. // swift-interface-format-version: 1.0
    // swift-compiler-version: Apple Swift version 5.8.1 (swiftlang-5.8.0.124.5 clang-1403.0.22.11.100)
    // swift-module-flags: -target arm64-apple-ios11.0-simulator -enable-objc-interop -enable-library-evolution
    -swift-version 5 -enforce-exclusivity=checked -O -module-name Logging
    // swift-module-flags-ignorable: -enable-bare-slash-regex
    import Darwin
    import Swift
    import _Concurrency
    import _StringProcessing
    public protocol LogHandler : Logging._SwiftLogSendableLogHandler {
    var metadataProvider: Logging.Logger.MetadataProvider? { get set }
    func log(level: Logging.Logger.Level, message: Logging.Logger.Message, metadata: Logging.Logger.Metadata?,
    source: Swift.String, file: Swift.String, function: Swift.String, line: Swift.UInt)
    @available(*, deprecated, renamed: "log(level:message:metadata:source:file:function:line:)")
    func log(level: Logging.Logger.Level, message: Logging.Logger.Message, metadata: Logging.Logger.Metadata?, file:
    Swift.String, function: Swift.String, line: Swift.UInt)
    subscript(metadataKey _: Swift.String) -> Logging.Logger.Metadata.Value? { get set }
    var metadata: Logging.Logger.Metadata { get set }
    var logLevel: Logging.Logger.Level { get set }
    }
    extension Logging.LogHandler {
    public var metadataProvider: Logging.Logger.MetadataProvider? {
    get
    set
    }
    }
    extension Logging.LogHandler {
    @available(*, deprecated, message: "You should implement this method instead of using the default
    implementation")
    public func log(level: Logging.Logger.Level, message: Logging.Logger.Message, metadata:
    Logging.Logger.Metadata?, source: Swift.String, file: Swift.String, function: Swift.String, line: Swift.UInt)

    View Slide

  76. Library Evolutionͷ੍ݶ
    • Ұ෦ͷύοέʔδ͸Library EvolutionʹରԠͰ͖ͳ͍ͨΊϏϧυͰ͖ͳ͍

    • swift-nio, swift-collectionsͳͲ΋

    • ࣮૷ͷΠϯϥΠϯԽͳͲɺޓ׵ੑҡ͕࣋Ͱ͖ͳ͍ݴޠ࢓༷Λ࢖༻͍ͯ͠
    Δέʔε͕͋ΔͨΊ

    • ͜ΕΒΛϑϨʔϜϫʔΫԽ͢Δͱ͖͸ແޮԽ͢Δඞཁ͕͋Δ

    View Slide

  77. Library EvolutionΛແޮԽͨ͠XCFramework
    • ී௨ʹXCFrameworkΛ࡞ΔͱɺLibrary Evolution͕ແޮԽ͞ΕͨFramework͔
    Β͸ੜ੒Ͱ͖ͳ͍ʢΤϥʔ͕ग़ͯ͠·͏ʣ

    • Library EvolutionΛແޮԽͨ͠ϑϨʔϜϫʔΫΛXCFrameworkԽ͢Δ৔߹ɺ`-
    allow-internal-distribution` ͕ඞཁ
    $ xcodebuild -create-xcframework \
    -framework Release-iphoneos/MyPackage.framework \
    -framework Release-iphonesimulator/MyPackage.framework \
    -output MyFramework.xcframework \
    -allow-internal-distribution

    View Slide

  78. ScipioͰͷLibrary Evolution
    • ී௨͸XCFrameworkͷੜ੒͸Library Evolutionͷ༗ޮԽ͕ਪ঑͞ΕΔ

    • ScipioͷϢʔεέʔεͷΑ͏ʹಉ͡ϓϩδΣΫτ಺Ͱͷར༻͕อূ͞ΕΔ৔
    ߹ɺແޮʹ͢Δ͜ͱ΋Ͱ͖Δ

    • ScipioͰ͸σϑΥϧτͰΦϑʹͳ͍ͬͯΔ

    • —enable-library-evolutionͰ༗ޮԽ

    View Slide

  79. Clangλʔήοτ
    • C, ObjCͳͲͷ࣮૷Λ࣋ͭλʔήοτ

    • Swiftλʔήοτͱ͸ҟͳΓHeader, modulemapͷग़ྗ͕ඞਢ

    • ͜ͷลͷߏ੒ʹΑΓγϯϓϧʹFrameworkԽͰ͖ͳ͍ྫ͕͋Δ

    View Slide

  80. MyFramework.framework
    MyFramework
    Info.plist ϝλσʔλ
    Modules
    Headers
    ϥΠϒϥϦຊମ
    module.modulemap
    MyFramework.h ϔομʔ
    modulemap
    ŋ
    ŋ
    ŋ

    View Slide

  81. modulemapͱ͸
    • ෳ਺ͷϔομʔΛϞδϡʔϧͱͯ͠ѻ͏ͨΊͷϚοϐϯάΛهड़͢ΔϑΝΠϧ

    • ͜ΕʹΑͬͯ import MyFramework Ͱϔομʔʹఆٛ͞ΕͨΠϯλʔϑΣΠε
    ΛࢀরͰ͖Δ
    framework module MyFramework {
    header “MyFramework.h"
    header “Model.h"
    header “Runner.h"
    export *
    }
    Ϟδϡʔϧ໊

    View Slide

  82. ClangλʔήοτͷϑϨʔϜϫʔΫԽ
    • SwiftλʔήοτͷϑϨʔϜϫʔΫԽͱҟͳΓෳࡶ

    • ϔομʔͷincludeࢦఆʹΑΓϑϨʔϜϫʔΫԽͨ͠ͱ͖ʹյΕΔ͜ͱ͕͋Δ

    • ScipioͰϏϧυͰ͖ͳ͍έʔεͷଟ͘͸͜ΕʹىҼ͢Δ

    View Slide

  83. Mixed Languageλʔήοτ
    • SwiftͱC FamilyͳͲɺෳ਺ͷݴޠΛ࣋ͭλʔήοτ

    • ݱঢ়ͷSwiftPMͰ͸ະରԠͷͨΊɺScipioͰ΋αϙʔτ͍ͯ͠ͳ͍

    • SE-403 Package Manager Mixed Language Target Supportͱ࣮ͯ͠૷͕ܾ
    ·͍ͬͯΔ͕·ͩ࢖͑ͳ͍

    View Slide

  84. Resourceαϙʔτ
    • Swift Package͸Ϧιʔε͕ѻ͑Δ

    • FrameworkԽͨ͠৔߹΋ϦιʔεόϯυϧΛؚΉ͜ͱ͕Ͱ͖Δ

    • Ϧιʔεόϯυϧ͸PIFͷ࣌఺Ͱఆٛ͞Ε͍ͯΔͨΊɺϏϧυγεςϜ͕উ
    खʹ࡞ͬͯ͘ΕΔ

    View Slide

  85. MyFramework.framework
    MyFramework
    Info.plist
    Modules
    MyFramework.bundle ϦιʔεόϯυϧʢσΟϨΫτϦʣ

    View Slide

  86. Bundle.moduleαϙʔτ
    • Swift Package͸Bundle.module͔ΒϦιʔεʹΞΫηεͰ͖Δ

    • ࣮ଶ͸SwiftPM͕Ϗϧυ࣌ʹextensionΛૠೖ͍ͯ͠Δ

    • ScipioͰϑϨʔϜϫʔΫԽͨ͠৔߹΋ಉ͡Α͏ʹ࢖͑Δ
    let resourceURL = Bundle.module.url(
    forResource: "image",
    withExtension: “png”
    )

    View Slide

  87. https://github.com/apple/swift-package-manager/blob/667a00670becac532b85dcd46caeacd1c3a5bdda/Sources/Build/BuildDescription/SwiftTargetBuildDescription.swift#L324
    SwiftPM͕Ϗϧυ࣌ʹextension༻ͷίʔυΛੜ੒ͯ͠௥Ճ͍ͯ͠Δ

    View Slide

  88. Scipioͷར఺
    • SwiftPM + XcodeΛϕʔεͱ͍ͯ͠ΔͨΊյΕͮΒ͍
    • ґଘղܾ΍औಘΛ௨ৗͷSwiftPMͱಉ༷ʹߦ͏

    • SwiftPM͕ϝϯς͞ΕΔݶΓ͸େ͖͘มߋ͞ΕͮΒ͍

    View Slide

  89. Scipioͷར఺
    • ࣙΊ΍͍͢
    • ґଘ͕Swift PackageͰ͋Δ͜ͱ͸มΘΒͳ͍ͨΊɺ௨ৗར༻Ͱ໰୊ͳ͍৔
    ߹͸ɺ௨ৗͷ౷߹ํ๏ʹ໭ͤΔ

    • ෦෼తʹXcode౷߹Λߦ͍ɺΩϟογϡ͍ͨ͠෦෼͚ͩXCFrameworkͱ͠
    ͯѻ͏͜ͱ΋Ͱ͖Δ

    View Slide

  90. ୈ2ষ·ͱΊ
    • Scipioͱ͍͏ϏϧυπʔϧΛ࡞ͬͯXCFrameworkΛੜ੒͍ͯ͠Δ

    • SwiftPMͷج൫ʹ৐Δ͜ͱͰɺͳΔ΂͘؆୯ʹੜ੒Ͱ͖ΔΑ͏ʹ͍ͯ͠Δ

    • ΩϟογϡγεςϜ΋͋Γɺ੒Ռ෺ͷ࠶ར༻΍ڞ༗͕༰қ

    • Ͳ͏ͧ͝ར༻͍ͩ͘͞

    • https://github.com/giginet/Scipio

    View Slide

  91. LINE iOSͷ
    ϏϧυγεςϜͰͷ׆༻
    ୈ3ষ

    View Slide

  92. LINE iOSϏϧυج൫΁ͷదԠ
    • ։ൃͨ͠ϏϧυπʔϧͰLINE iOSͷϏϧυج൫ΛͲͷΑ͏ʹվળ͔ͨ͠

    • Prebuilt Task͔ΒͲͷΑ͏ʹBazelͷར༻Λ֎͍͔ͯ͘͠
    Bazel
    PrebuiltλεΫ

    View Slide

  93. PrebuiltλεΫͷඪ४Խ
    • OSSϥΠϒϥϦͷFrameworkԽ

    • ࣾ಺࣮૷ͷFrameworkԽ

    • όΠφϦϑϨʔϜϫʔΫͷऔಘ

    • APIεΩʔϜ͔Βͷίʔυੜ੒

    View Slide

  94. PrebuiltλεΫͷඪ४Խ
    • OSSϥΠϒϥϦͷFrameworkԽ

    • ࣾ಺࣮૷ͷFrameworkԽ

    • όΠφϦϑϨʔϜϫʔΫͷऔಘ

    • APIεΩʔϜ͔Βͷίʔυੜ੒
    XCFrameworkԽ

    XCFramework or XcodeϓϩδΣΫτԽ

    Swift PackageԽ

    Build Tools PluginԽ

    View Slide

  95. PrebuiltλεΫͷඪ४Խ
    • OSSϥΠϒϥϦͷFrameworkԽ
    • ࣾ಺࣮૷ͷFrameworkԽ

    • όΠφϦϑϨʔϜϫʔΫͷऔಘ

    • APIεΩʔϜ͔Βͷίʔυੜ੒
    XCFrameworkԽ

    XCFramework or XcodeϓϩδΣΫτԽ

    Swift PackageԽ

    Build Tools PluginԽ

    View Slide

  96. OSSϥΠϒϥϦͷঢ়گ
    • 60~70͍ۙOSSϥΠϒϥϦ

    • ར༻ঢ়گ͕ෆ໌ͳ΋ͷ

    • ਺೥લ͔Βόʔδϣϯ͕ஔ͍͍͔ͯΕͯΔ΋ͷ

    • upstream͕obsoleteʹͳ͍ͬͯΔ΋ͷ

    • forkͯ͠patchΛ౰͍ͯͯΔ΋ͷ

    View Slide

  97. upstream͕
    ϝϯς͞ΕͯΔ͔
    ֎͢
    ґଘΛ֎ͤΔ͔ PackageԽ
    ͞ΕͯΔ͔
    XCFrameworkԽ
    forkͯ͠PackageԽ
    ࣮૷ͷҰ෦ΛҠ͢
    Ξοϓσʔτ
    upstreamͷPackageԽ
    ࣮૷ΛҠͤΔ͔

    View Slide

  98. upstream͕
    ϝϯς͞ΕͯΔ͔
    ֎͢
    ґଘΛ֎ͤΔ͔ PackageԽ
    ͞ΕͯΔ͔
    XCFrameworkԽ
    forkͯ͠PackageԽ
    ࣮૷ͷҰ෦ΛҠ͢
    Ξοϓσʔτ
    upstreamͷPackageԽ
    ࣮૷ΛҠͤΔ͔

    View Slide

  99. upstream͕
    ϝϯς͞ΕͯΔ͔
    ֎͢
    ґଘΛ֎ͤΔ͔ PackageԽ
    ͞ΕͯΔ͔
    XCFrameworkԽ
    forkͯ͠PackageԽ
    ࣮૷ͷҰ෦ΛҠ͢
    Ξοϓσʔτ
    upstreamͷPackageԽ
    ࣮૷ΛҠͤΔ͔

    View Slide

  100. ϝϯς͞ΕͯΔϥΠϒϥϦ
    • ͢ͰʹPackageରԠ͞Ε͍ͯΔ΋ͷ͔ΒঃʑʹରԠ͍ͯ͘͠

    • όʔδϣϯ͕ஔ͍ͯߦ͔ΕͯΔ΋ͷ͸Ξοϓσʔτ

    • upstream͕ରԠ͍ͯ͠ͳ͍΋ͷ͸ରԠ

    View Slide

  101. upstream͕
    ϝϯς͞ΕͯΔ͔
    ֎͢
    ґଘΛ֎ͤΔ͔ PackageԽ
    ͞ΕͯΔ͔
    XCFrameworkԽ
    forkͯ͠PackageԽ
    ࣮૷ͷҰ෦ΛҠ͢
    Ξοϓσʔτ
    upstreamͷPackageԽ
    ࣮૷ΛҠͤΔ͔

    View Slide

  102. ϝϯς͕ࢭ·ͬͨϥΠϒϥϦ
    • ObjC࣌୅ͷϥΠϒϥϦͳͲɺ਺೥લʹ౷߹͞Εͯɺ୭΋ϝϯς͠ͳ͍·
    ·์ஔ͞Εͨґଘؔ܎͕ଟ਺

    • Ұ෦࣮૷͚ͩҠͤΔ৔߹͸ɺϥΠηϯεΛҡ࣋ͨ͠··ίʔυͷΈΛҠ
    ͠ɺґଘ͸࡟আ

    View Slide

  103. fork͸࠷ऴखஈ
    • Ͳ͏ʹ΋ͳΒͳ͍৔߹͸࠷ऴखஈͰfork

    • forkΛϏϧυ͠΍͍͢Α͏ʹύοέʔδԽ

    • কདྷతʹফͤΔΑ͏ʹ࣮૷ΛݮΒ͢λεΫԽɻ௕ظతʹ ͍ͯ͘͠

    View Slide

  104. PrebuiltλεΫͷඪ४Խ
    • OSSϥΠϒϥϦͷFrameworkԽ

    • ࣾ಺࣮૷ͷFrameworkԽ
    • όΠφϦϑϨʔϜϫʔΫͷऔಘ

    • APIεΩʔϜ͔Βͷίʔυੜ੒
    XCFrameworkԽ

    XCFramework or XcodeϓϩδΣΫτԽ

    Swift PackageԽ

    Build Tools PluginԽ

    View Slide

  105. ࣾ಺ϥΠϒϥϦͷSwiftPMԽ
    • ࣾ಺ϥΠϒϥϦͰPrebuiltϑϨʔϜϫʔΫԽ͠΍͍͢΋ͷ͸ύοέʔδରԠ

    • σϞΞϓϦͷ։ൃͰඪ४తͳར༻͕Ͱ͖ΔΑ͏ʹͳͬͨ

    • Ұ෦೉͍͠ύοέʔδԽ͕೉͍͠έʔε͸XcodeϓϩδΣΫτԽ

    • Mixed Language Target(Swift/ObjCͷࠞ੒λʔήοτ)

    • ґଘ͕ଟ͘࠶ؼతʹύοέʔδԽ͕ඞཁͳέʔε

    View Slide

  106. PrebuiltλεΫͷඪ४Խ
    • OSSϥΠϒϥϦͷFrameworkԽ

    • ࣾ಺࣮૷ͷFrameworkԽ

    • όΠφϦϑϨʔϜϫʔΫͷऔಘ
    • APIεΩʔϜ͔Βͷίʔυੜ੒
    XCFrameworkԽ

    XCFramework or XcodeϓϩδΣΫτԽ

    Swift PackageԽ

    Build Tools PluginԽ

    View Slide

  107. όΠφϦϑϨʔϜϫʔΫͷϥΠϒϥϦԽ
    • ਂԕͳࣄ৘ʹΑΓɺϏϧυࡁΈͷϑϨʔϜϫʔΫΛ౷߹͢Δඞཁ͕͋Δ

    • Swift PackageͷBinaryTargetΛར༻
    • Scipio͸binaryTarget΋ѻ͏͜ͱ͕Ͱ͖Δ

    View Slide

  108. let package = Package(
    name: "CompanySDK",
    platforms: [
    .iOS(.v13)
    ],
    products: [
    .library(
    name: "CompanySDK",
    targets: ["CompanySDK"]
    ),
    ],
    targets: [
    .binaryTarget(
    name: "CompanySDK",
    path: "path/to/CompanySDK.xcframework"
    ),
    ]
    )

    View Slide

  109. PrebuiltλεΫͷඪ४Խ
    • OSSϥΠϒϥϦͷFrameworkԽ

    • ࣾ಺࣮૷ͷFrameworkԽ

    • όΠφϦϑϨʔϜϫʔΫͷऔಘ

    • APIεΩʔϜ͔Βͷίʔυੜ੒
    XCFrameworkԽ

    XCFramework or XcodeϓϩδΣΫτԽ

    Swift PackageԽ

    Build Tools PluginԽ

    View Slide

  110. ίʔυੜ੒λεΫͷҠߦ
    • SwiftGen΍APIεΩʔϚ(Apache Thrift)ͷίʔυΛੜ੒͠ɺprebuiltϑϨʔϜ
    ϫʔΫΛ࡞੒͍ͯͨ͠
    Bazel
    APIεΩʔϜ ੜ੒͞Εͨίʔυ Framework
    ੜ੒ Ϗϧυ
    Before

    View Slide

  111. ίʔυੜ੒λεΫͷҠߦ
    • prebuiltԽ͸೉͔ͬͨͨ͠ΊɺXcodeϓϩδΣΫτԽͯ͠XCWorkspaceʹ౷߹

    • ίʔυੜ੒͸Build Tools PluginԽ
    APIεΩʔϜ Framework
    xcodeproj
    Build Tools Plugin
    ੜ੒+Ϗϧυ
    Xcode
    After

    View Slide

  112. ·ͱΊɿBazel͔Βඪ४ͷϏϧυγεςϜ΁ͷҠߦ
    • ଟ͘ͷϥΠϒϥϦ͸Swift PackageԽͯ͠ScipioͰXCFrameworkʹϏϧυ

    • ϏϧυࡁΈϑϨʔϜϫʔΫ͸Swift PackageͷBinary TargetԽ

    • ෳࡶͳߏ੒ͷϏϧυ͸XcodeϓϩδΣΫτԽ + XCWorkspace౷߹

    • ίʔυੜ੒ͳͲલॲཧ͸Build Tools PluginԽ

    View Slide

  113. Framework XCFramework
    Ҡߦͨ͠ʂ

    View Slide

  114. Apple SiliconγϛϡϨʔλରԠ
    • ࠓ·Ͱ͸Bazel͔ΒFrameworkΛੜ੒͍ͯͨ͠ͷͰɺෳ਺ճϏϧυͯ͠ڧҾʹ
    γϛϡϨʔλʔରԠΛ͍ͯͨ͠
    Bazel
    Library.framework(ios-arm64)
    Library.framework(simulator-x86_64)
    Library.framework(simulator-arm64)
    Before

    View Slide

  115. Apple SiliconγϛϡϨʔλରԠ
    • XCFrameworkʹ౷߹͞ΕΔ͜ͱͰγϯϓϧʹͳͬͨ
    Scipio
    Library.xcframework
    After

    View Slide

  116. watchOS༻ϑϨʔϜϫʔΫରԠ
    • iOS, watchOS྆ํ͔ΒಉҰϑϨʔϜϫʔΫΛར༻͢Δͱ͖ɺϦωʔϜͯ͠ผ
    ໊ͷwatchOS༻Λ࡞੒͍ͯͨ͠ʢγϛϡϨʔλʔ༻΋ʣ
    Bazel
    Library.framework
    WatchLibrary.framework
    Before

    View Slide

  117. watchOS༻ϑϨʔϜϫʔΫରԠ
    • 1ͭͷXCFrameworkʹෳ਺ͷϓϥοτϑΥʔϜΛؚΊΔΑ͏ʹͳͬͨͷ
    Ͱɺ1ͭʹ౷߹Ͱ͖ͨɻϦωʔϜ΋ෆཁ
    Scipio
    Library.xcframework
    After

    View Slide

  118. ϦϞʔτΩϟογϡͷӡ༻
    • ScipioͷϦϞʔτΩϟογϡػೳΛ࢖ͬͯɺΦϒδΣΫτετϨʔδʹ
    XCFrameworkΛอଘ

    • ։ൃऀ͸ϑϨʔϜϫʔΫΛऔಘ͢Δ͚ͩͰΞϓϦέʔγϣϯϏϧυ͕Ͱ͖Δ
    Α͏ʹ

    View Slide

  119. 6cc7dbe.xcframework
    17aef70.xcframework
    ŋ
    ŋ
    ŋ
    Package.swift
    Package.swiftͷมߋΛݕ஌

    View Slide

  120. 6cc7dbe.xcframework
    17aef70.xcframework
    ŋ
    ŋ
    ŋ
    Package.swift
    CI͕ScipioͰXCFrameworkੜ੒
    ΦϒδΣΫτετϨʔδʢS3ޓ׵ʣ

    View Slide

  121. 6cc7dbe.xcframework
    17aef70.xcframework
    ŋ
    ŋ
    ŋ
    Package.swift
    ։ൃऀ͕Ϗϧυ࣌ʹXCFrameworkΛ
    औಘʢPublic URLʣ

    View Slide

  122. 6cc7dbe.xcframework
    17aef70.xcframework
    ŋ
    ŋ
    ŋ
    Package.swift
    ϑϨʔϜϫʔΫͷϏϧυ͕ෆཁʹ

    View Slide

  123. View Slide

  124. Ҡߦͷ݁Ռ - Ϗϧυ࣌ؒ
    PrebuiltλεΫ XcodeϏϧυ ߹ܭ
    2022/11 920s 500s 1,420s
    ݱࡏʢΩϟογϡ
    ͳ͠ʣ
    776s
    590s
    1,366s
    ݱࡏʢΩϟογϡ
    ͋Γʣ
    220s 810s

    View Slide

  125. Ҡߦͷ݁Ռ - Ϗϧυ࣌ؒ
    PrebuiltλεΫ XcodeϏϧυ ߹ܭ
    2022/11 920s 500s 1,420s
    ݱࡏʢΩϟογϡ
    ͳ͠ʣ
    776s
    590s
    1,366s
    ݱࡏʢΩϟογϡ
    ͋Γʣ
    220s 810s
    x3.5
    9෼16ඵվળ

    View Slide

  126. Ҡߦͷ݁Ռ - Ϗϧυ࣌ؒ
    PrebuiltλεΫ XcodeϏϧυ ߹ܭ
    2022/11 920s 500s 1,420s
    ݱࡏʢΩϟογϡ
    ͳ͠ʣ
    776s
    590s
    1,366s
    ݱࡏʢΩϟογϡ
    ͋Γʣ
    220s 810s
    x1.75

    View Slide

  127. ࠓޙͷల๬
    • ύοέʔδϚχϑΣετͷࣗಈߋ৽

    • όʔδϣϯ͕ஔ͍ͯߦ͔Εͳ͍Α͏ʹ͢Δ

    View Slide

  128. ࠓޙͷల๬
    • WWDC23ͷ৽ػೳͷαϙʔτ

    • XCFrameworkͷMergeable LibraryରԠ

    • XCFrameworkͷॺ໊΍ϓϥΠόγʔϚχϑΣετରԠ

    View Slide

  129. ౰ॳͷ໨ඪ
    • ͱʹ͔͘ඪ४ͷϏϧυγεςϜΛ࢖͍͍ͨ

    • Ϗϧυ੒Ռ෺͕࠶ར༻Ͱ͖ͯΩϟογϡ͠΍͍͢

    • ։ൃ͠΍͘͢ςετ͠΍͍͢

    • ґଘؔ܎ͷΞοϓσʔτ͕͠΍͍͢

    View Slide

  130. ୡ੒ʁ
    • ͱʹ͔͘ඪ४ͷϏϧυγεςϜΛ࢖͍͍ͨ

    • Ϗϧυ੒Ռ෺͕࠶ར༻Ͱ͖ͯΩϟογϡ͠΍͍͢

    • ։ൃ͠΍͘͢ςετ͠΍͍͢

    • ґଘؔ܎ͷΞοϓσʔτ͕͠΍͍͢

    View Slide

  131. ඪ४ʁ
    • BazelΛ࢖͏ΑΓ͸ඪ४తͳߏ੒ʹ͍͕ۙͮͨ

    • ݱΕͨ৽ͨͳϏϧυγεςϜ

    • ඪ४ͷ࢓૊ΈΛ࢖͏޻෉͸͕ͨ͠ŋŋŋŋŋŋ

    • Scipioࣗମͷෳࡶ͞

    • ୈ2ɺୈ3ͷෛ࠴Λ࢈ΜͰ͍Δ͚ͩઆ΋͋Δ

    View Slide

  132. Swift PackageҠߦ͸ਖ਼ղ
    • ͱ͸͍͑ґଘͷSwift PackageԽ͸ਖ਼͍͠͸ͣ

    • ࠓޙඪ४ͷSwift Package౷߹͕ڧԽ͞Εͯɺͦ͜ʹ৐Δͷ͕Ұ൪ྑ͍

    • →কདྷࠓͷߏ੒Λࣺͯ΍͘͢ͳͬͨ

    View Slide

  133. ඪ४ͷ
    ϏϧυγεςϜΛ
    ࢖͓͏ʂʂʂ

    View Slide

  134. ·ͱΊ
    • Ϗϧυ؀ڥҠߦʹΑΓBazel͕શ෦֎ΕΔ໨ॲཱ͕͖ͬͯͨ

    • XCFrameworkԽͰɺ੒Ռ෺ΛΩϟογϡͭͭ͠։ൃͰ͖ΔΑ͏ʹͳͬͨ

    • Scipio͸࣮༻ஈ֊ͳͷͰϥΠϒϥϦͷϏϧυʹ͓ࠔΓͷํ͸͝ར༻͍ͩ͘͞

    • XcodeͷSwift Package౷߹Λ࢖ͬͯ໰୊͕ͳ͚Ε͹ී௨ʹ։ൃ͠Α͏

    • ී௨͕͍ͪ͹Μ

    View Slide

  135. Scipio
    - An awesome build tool -
    https://github.com/giginet/Scipio

    View Slide

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

    View Slide