Upgrade to Pro — share decks privately, control downloads, hide ads and more …

新しいビルドツールScipioのご紹介

giginet
PRO
February 21, 2023

 新しいビルドツールScipioのご紹介

giginet
PRO

February 21, 2023
Tweet

More Decks by giginet

Other Decks in Programming

Transcript

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

    View Slide

  2. ୭ʁ
    • @giginet

    • LINEגࣜձࣾ Developer Experience։ൃνʔϜ

    • ex ΫοΫύουגࣜձࣾ ϞόΠϧج൫෦

    • ٕज़ސ໰

    • ϚωʔϑΥϫʔυ, peep, ϢϏϨδ

    • OSSϝϯςφ

    • Carthage, XcodeGen, fastlaneͳͲ

    • ࠷ۙ͸ϗάϫʔπϨΨγʔ΍ͬͯ·͢

    • ྈ͸εϦβϦϯ

    View Slide

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

    View Slide

  4. ࠓ೔࿩͢͜ͱ
    • ։ൃதͷϏϧυπʔϧScipioͷ͝঺հ

    • Swift Package͔ΒXCFrameworkΛ࡞Δ৽͍͠Ϗϧυπʔϧ

    • ؆୯ͳ࢖͍ํ

    • Ͳ͏΍ͬͯಈ͍͍ͯΔ͔؆୯ͳ֓ཁ

    View Slide

  5. • Xcodeͷඪ४తͳύοέʔδ౷߹Ͱ͸ɺύοέʔδͷΩϟογϡʹ
    ໰୊͕͋Δ

    • Clean͢Δͱpurgeͨ͠Γͱ͔ŋŋŋŋŋŋ

    • ྫ͑͹ڊେͳϝοηʔδϯάΞϓϦͰࠔ͍ͬͯΔ

    • ύοέʔδ؅ཧͱXCFrameworkͷੜ੒ͷྑ͍ख๏͕ͳ͍
    ͜Ε͸Կʁ

    View Slide

  6. ྫ͑͹Carthage
    • XCFrameworkαϙʔτ͸͋Δ͕ŋŋŋŋŋŋ

    • Swift Packageͱͷޓ׵ੑ͕ͳ͘ɺύοέʔδ࡞ऀͷରԠ͕ඞཁ

    • ϝϯς͞Εͯͳͯ͘Φϫίϯ

    • Carhage͸໓Ϳ΂͖

    View Slide

  7. https://github.com/Carthage/Carthage/releases/tag/0.39.0
    • Φϫίϯ͗ͯ͢୭΋ϝϯςͯ͠ͳ͍ͷͰ๻͕ϦϦʔεͯ͠Δ

    • ઌ݄1೥൒ͿΓʹ৽όʔδϣϯ͕ग़·ͨ͠

    View Slide

  8. Scipio


    - An awesome build tool -


    https://github.com/giginet/Scipio
    ͦ͜Ͱ

    View Slide

  9. ͳʹ͕Ͱ͖Δͷʁ
    • Swift Package Manager(SwiftPM)ʹΑΔґଘղܾ

    • γϛϡϨʔλϏϧυɺStatic FrameworkαϙʔτɺσόοάγϯϘ
    ϧରԠ

    • ϚϧνϓϥοτϑΥʔϜରԠ

    • ϦιʔεόϯυϧରԠ

    • ΩϟογϡγεςϜ

    • Ϗϧυ͕ඞཁ͔൑அͯ͠ඞཁͳͱ͖͚ͩϦϏϧυ

    • ϦϞʔτΩϟογϡ

    • ύοέʔδຖͷϏϧυઃఆͷ஫ೖ

    View Slide

  10. ಈ࡞ͷ࢓૊Έ
    • Swift Package Managerͷඪ४ػೳ
    Ͱґଘؔ܎ΛղܾɺύοέʔδΛ
    औಘ

    • औಘͨ͠ύοέʔδ͔Β
    XCFrameworkΛੜ੒
    ґଘͷղܾ
    ύοέʔδͷऔಘ
    XCFrameworkͷϏϧυ

    View Slide

  11. ͔͍͔ͭͨ
    1.ΞϓϦʹඞཁͳґଘؔ܎Λॻ͍ͨSwiftύοέʔδΛ༻ҙ

    2.ScipioΛ࣮ߦ

    3.XCFramework͕Ͱ͖Δ 🤗

    View Slide

  12. // 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

  13. $ 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ͷ࣮ߦ

    View Slide

  14. ͜Ε͚ͩͰ


    XCFramework͕Ͱ͖ͯ


    ✌ ࠷ߴ ✌

    View Slide

  15. ΩϟογϡγεςϜ
    • ͢ͰʹϏϧυ͞Ε͍ͯΔύοέʔδ͕͋Ε͹ϏϧυεΩοϓ

    • 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.


    View Slide

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

    View Slide

  17. 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

    View Slide

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

    View Slide

  19. ࠓ೔͸


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

    View Slide

  20. چख๏ɿXcodeϓϩδΣΫτͷੜ੒
    • ैདྷख๏ʢࠓ͸΍Ίͨʣ

    • Swift Package͔ΒxcodeprojΛੜ੒͠
    ͯɺxcodebuildΛ࢖ͬͯXCFramework
    Λੜ੒
    ґଘͷղܾ
    ύοέʔδͷऔಘ
    XcodeϓϩδΣΫτͷੜ੒
    XCFrameworks
    swift package generate-xcodeproj
    xcodebuild
    swift package resolve

    View Slide

  21. • 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

    View Slide

  22. Project Generatorͷखಈੜ੒
    • generate-xcodeprojΛಠ࣮ࣗ૷

    • SwiftPMͷඪ४ػೳΛ࢖ͬͯPackage ManifestΛύʔε

    • tuist/XcodeProjͳͲͷαʔυύʔςΟϥΠϒϥϦΛ࢖ͬͯ
    xcodeprojΛੜ੒

    • generate-xcodeproj͕ରԠ͍ͯ͠ͳ͍ػೳ΋ಠ࣮ࣗ૷

    • ͋Δఔ౓͸ϫʔΫ͕ͨ͠ίʔυྔ͕ଟ͗ͯ͢อकੑ͕ࢮ๢ 🔥

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

    View Slide

  23. ৽ख๏ɿ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

    View Slide

  24. [
    {
    "contents" : {
    "guid" : "Workspace:/Users/giginet/.ghq/github.com/apple/[email protected]",
    "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]" : [

    View Slide

  25. $ 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Λฤूͯ͠ϏϧυઃఆΛ࿔Ε͹͜ΕͰϏϧυͰ͖ΔͷͰ͸ʁ

    • →Ͱ͖ͨ 🎉

    View Slide

  26. ࣍ճ༧ࠂ
    • ϚδͰࢿྉ΋ͳ͍࣌ؒ͠΋ͳ͍ͷͰࠓ೔͸͜͜·Ͱ

    • ࣍ճͲ͔ͬͰ࿩͔͢΋

    • Θ͍Θ͍swiftcͱ͔

    • ΄͔ͷΧϯϑΝϨϯεͱ͔

    • ࠙਌ձͰฉ͍͍ͯͩ͘͞

    View Slide

  27. ScipioϓϩδΣΫτͷݱঢ়
    • ࠷৽൛Ͱ͸ଟ͘ͷύοέʔδ͕XCFrameworkԽͰ͖ΔΑ͏ʹ 🎉

    • swift-nio, firebase-ios-sdk, RxSwiftͳͲ

    • Ұ෦SwiftPMͷfork͕ඞཁͰɺݱঢ়upstreamʹରͯ͠PRૹͬͨΓ͠
    ͍ͯͯϦϦʔεͰ͖͍ͯͳ͍ͷͰਖ਼ࣜϦϦʔεΛ͓଴͍ͪͩ͘͞

    • 2023/2/21ݱࡏɺࢼ͍ͨ͠ํ͸͜ͷPR͕࠷৽൛Ͱ͢

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

    View Slide

  28. ·ͱΊ
    • Scipio͸։ൃதͰͦͷ͏ͪͪΌΜͱ͓൸࿐໨Ͱ͖ͦ͏ͳͷͰڵຯ͕͋Ε͹ͥͻ

    • େن໛ϓϩδΣΫτͰӡ༻࣮ͯ͠༻ஈ֊ʹ͍ͨ͠

    • ଓ͖͸Ͳ͔͜ͷΧϯϑΝϨϯεͰ࿩͍ͨ͠

    • ͍͔ͭ͘ւ֎ΧϯϑΝϨϯεʹCfPΛग़͍ͯ͠ΔͷͰͦͷ͏ͪ࿩͔͢΋

    • Ͳ͏ͧ͝ظ଴͍ͩ͘͞

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

    • ελʔ͍ͩ͘͞ ⭐

    View Slide

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

    View Slide