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

NSSpain 2023: Moving from Cocoapods to SwiftPM

NSSpain 2023: Moving from Cocoapods to SwiftPM

Discover the realities and challenges of adopting Swift Package Manager in the XING iOS app, to be able to organize and design the modularization of more than 100 internal libraries.

Oswaldo Rubio

September 18, 2023
Tweet

Other Decks in Programming

Transcript

  1. Moving from Cocoapods to
    Swift Package Manager
    Oswaldo Rubio & Juantri Jimenez
    Our journey

    View Slide

  2. Who we are?
    iOS Platform team members at XING
    Oswaldo Rubio Juantri Jimenez

    View Slide

  3. What is XING?

    View Slide

  4. The problems and solutions we found while
    adopting gradually Swift Package Manager
    in a large codebase
    What’s the point?

    View Slide

  5. A bit of context
    🎒
    👨💻
    👩💻
    + 30 iOS Developers
    +120 Development Pods
    ~30%
    ⏳ + 13 years old codebase (monorepo)
    📈 + 300K daily unique visitors
    📚 + 300K LOC
    📐 50% UIKit + 50% SwiftUI

    View Slide

  6. The reasons behind
    1. Reduce our technical debt
    2. Having a more
    f
    lexible and
    capable Package manager
    3. Having better build times &
    developer experience
    moving to SPM

    View Slide

  7. The problem
    🤯

    View Slide

  8. The problem
    🤯
    1. More than 20 dependencies per
    module (average)
    2. High transitive dependency
    usage
    3. 30% of mixed Objective-C code
    across the project

    View Slide

  9. 🧪 The experiment
    … and what we learned during a Hackweek
    1. Dependencies from our features modules needs to be removed
    2. Inter-dependency between modules needs to be reduced
    3. A roadmap needs to be de
    f
    ined
    4. Our managers and community needs to be convinced

    View Slide

  10. Our journey starts here

    View Slide

  11. 📦 Dependencies

    View Slide

  12. Third party dependencies

    View Slide

  13. Third party dependencies
    App
    Dependency1 Dependency2
    Dependency3
    Feature1
    Feature2 Common1 Common2
    🟦 Pod.xcodeProj

    View Slide

  14. Third party dependencies
    App
    Dependency1 Dependency2 Dependency3
    Feature1
    Feature2 Common1 Common2
    🟦 Pod.xcodeProj

    View Slide

  15. Third party dependencies
    App
    Dependency1 Dependency2 Dependency3 Feature1
    Feature2 Common1 Common2
    📦 dependencies Package 🟦 Pod.xcodeProj

    View Slide

  16. Conditional Dependencies

    View Slide

  17. 📉 Complexity reduction

    View Slide

  18. Thomas J. McCabe, Sr in 1976 - Wikipedia
    "It´s a quantitative measure of the number
    of linearly independent paths through a
    program’s source code.”

    View Slide

  19. Predicting Subsystem failures using dependency graphs, 2016 - Microsoft
    “The complexity of the dependency
    structure predicts the number of defects.”

    View Slide

  20. Tooling - jungle
    https://github.com/xing/jungle
    Complexity = E - V + P

    E - Edges

    V - Nodes

    P - Weakly connected components
    Complexity: 4 - 5 + 1 = 0
    Complexity: 6 - 5 + 1 = 2

    View Slide

  21. You can’t improve what you don’t measure.

    View Slide

  22. Reducing complexity in our project
    Last 3 years

    View Slide

  23. Less complexity, less build time
    Complexity: 55
    Complexity: 3

    View Slide

  24. 🛣 We need a roadmap

    View Slide

  25. 🛣 We need a roadmap
    • De
    f
    ine a migration plan
    • Document our migration process
    • Get a time estimation of the overall process
    • Get our managers and community approval

    View Slide

  26. Migration plan tooling

    View Slide

  27. We have a roadmap

    View Slide

  28. 🛠 The Migration

    View Slide

  29. 🛠 The Migration
    Gradual and using both package managers
    Non invasive for other teams
    Integrate as fast as possible

    View Slide

  30. • Module migration status
    • Product containers
    • SPM Schemes management
    • One or Multiple Swift Packages
    • Using SPM products in Cocoapods
    • Cyclic dependencies between languages
    Migration challenges

    View Slide

  31. • Module migration status
    • Product containers
    • SPM Schemes management
    • One or Multiple Swift Packages
    • Using SPM products in Cocoapods
    • Cyclic dependencies between languages
    Migration challenges

    View Slide

  32. Module migration status
    Migrated Integrated
    Module Availability Cocoapods and SPM Only SPM
    Module usage for running With CocoaPods With SPM
    Module usage for Testing With SPM With SPM

    View Slide

  33. Original status
    📲 XING App
    🟦 Pod.xcodeProj
    JobsCoreTests
    JobsCore
    📂 JobsCore/Sources 📂 JobsCore/Tests

    View Slide

  34. Migrated status
    📦 features Package
    📲 XING App
    🟦 Pod.xcodeProj
    JobsCoreTests JobsCore
    📂 JobsCore/Sources
    JobsCoreModule
    📂 JobsCore/Tests

    View Slide

  35. Integrated status
    📦 features Package
    📲 XING App
    JobsCoreTests JobsCore
    📂 JobsCore/Sources
    📂 JobsCore/Tests

    View Slide

  36. View Slide

  37. • Module migration status
    • Product containers
    • SPM Schemes management
    • One or Multiple Swift Packages
    • Using SPM products in Cocoapods
    • Cyclic dependencies between languages
    Migration challenges

    View Slide

  38. Product container

    View Slide

  39. • Module migration status
    • Product containers
    • SPM Schemes management
    • One or Multiple Swift Packages
    • Using SPM products in Cocoapods
    • Cyclic dependencies between languages
    Migration challenges

    View Slide

  40. SPM schemes management

    View Slide

  41. • Module migration status
    • Product containers
    • SPM Schemes management
    • One or Multiple Swift Packages
    • Using SPM products in Cocoapods
    • Cyclic dependencies between languages
    Migration challenges

    View Slide

  42. One package or multiple ones?

    View Slide

  43. New Swift 5.9 Package Access modi
    f
    ier
    Private
    Open
    Public
    Internal
    Fileprivate
    Package
    🆕

    View Slide

  44. One package or multiple ones?
    Cocoapods App
    Pod1 Pod2 Pod3
    Pod4 Pod5 Pod6
    SPM App
    Prod1
    Package1 Package2
    Prod2 Prod10 Prod11
    Target1 Target2 Target10 Target11
    Target3
    Pod
    f
    ile
    All dependencies allowed Only Products are accessible to other
    packages

    View Slide

  45. One package or multiple ones?

    View Slide

  46. • Module migration status
    • Product containers
    • SPM Schemes management
    • One or Multiple Swift Packages
    • Using SPM products in Cocoapods
    • Cyclic dependencies between languages
    Migration challenges

    View Slide

  47. Using SPM modules inside Cocoapods
    Can we do this?
    📦 features Package
    📲 XING App
    🟦 Pod.xcodeProj
    MyCPModule
    Common https://github.com/CocoaPods/CocoaPods/pull/11953
    💥

    View Slide

  48. Using SPM modules inside Cocoapods
    Yes, we can

    View Slide

  49. Using SPM modules inside Cocoapods
    And that’s how we do it

    View Slide

  50. Using SPM modules inside Cocoapods
    How to create .xcframeworks
    swift package generate-xcodeproj
    xcodebuild archive
    xcodebuild -create-xcframework
    Swift 5.8
    Create Xcode Project from .podspec
    xcodebuild archive
    xcodebuild -create-xcframework
    Swift 5.9

    View Slide

  51. • Module migration status
    • Product containers
    • SPM Schemes management
    • One or Multiple Swift Packages
    • Using SPM products in Cocoapods
    • Cyclic dependencies between languages
    Migration challenges

    View Slide

  52. Cyclic dependencies between languages

    View Slide

  53. Cyclic dependencies between languages
    Not allowed!

    View Slide

  54. Conclusions

    View Slide

  55. Conclusions
    • De
    f
    ining more than one package helps to create good practices
    boundaries for your internal modules
    • Having a roadmap before starting helps to convince your team and
    management
    • Build time was not reduced by using only SPM, but because we improved
    f
    irst our architecture
    • Gradual migration helps us to not having unexpected surprises

    View Slide

  56. Evolution and status

    View Slide

  57. $ bundle exec pod deintegrate

    View Slide

  58. Thanks to all our mates
    Markus Faßbender
    Shammi Didla
    Andreas Koslowski
    Mark Schütte
    Özgün Zor
    Eslam Foad
    Akshay Shetty

    View Slide