Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

What is XING?

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

The problem 🀯

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

πŸ§ͺ 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

Slide 10

Slide 10 text

Our journey starts here

Slide 11

Slide 11 text

πŸ“¦ Dependencies

Slide 12

Slide 12 text

Third party dependencies

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

Third party dependencies App Dependency1 Dependency2 Dependency3 Feature1 Feature2 Common1 Common2 πŸ“¦ dependencies Package 🟦 Pod.xcodeProj

Slide 16

Slide 16 text

Conditional Dependencies

Slide 17

Slide 17 text

πŸ“‰ Complexity reduction

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

Reducing complexity in our project Last 3 years

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

πŸ›£ We need a roadmap

Slide 25

Slide 25 text

πŸ›£ 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

Slide 26

Slide 26 text

Migration plan tooling

Slide 27

Slide 27 text

We have a roadmap

Slide 28

Slide 28 text

πŸ›  The Migration

Slide 29

Slide 29 text

πŸ›  The Migration Gradual and using both package managers Non invasive for other teams Integrate as fast as possible

Slide 30

Slide 30 text

β€’ Module migration status β€’ Product containers β€’ SPM Schemes management β€’ One or Multiple Swift Packages β€’ Using SPM products in Cocoapods β€’ Cyclic dependencies between languages Migration challenges

Slide 31

Slide 31 text

β€’ Module migration status β€’ Product containers β€’ SPM Schemes management β€’ One or Multiple Swift Packages β€’ Using SPM products in Cocoapods β€’ Cyclic dependencies between languages Migration challenges

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

Original status πŸ“² XING App 🟦 Pod.xcodeProj JobsCoreTests JobsCore πŸ“‚ JobsCore/Sources πŸ“‚ JobsCore/Tests

Slide 34

Slide 34 text

Migrated status πŸ“¦ features Package πŸ“² XING App 🟦 Pod.xcodeProj JobsCoreTests JobsCore πŸ“‚ JobsCore/Sources JobsCoreModule πŸ“‚ JobsCore/Tests

Slide 35

Slide 35 text

Integrated status πŸ“¦ features Package πŸ“² XING App JobsCoreTests JobsCore πŸ“‚ JobsCore/Sources πŸ“‚ JobsCore/Tests

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

β€’ Module migration status β€’ Product containers β€’ SPM Schemes management β€’ One or Multiple Swift Packages β€’ Using SPM products in Cocoapods β€’ Cyclic dependencies between languages Migration challenges

Slide 38

Slide 38 text

Product container

Slide 39

Slide 39 text

β€’ Module migration status β€’ Product containers β€’ SPM Schemes management β€’ One or Multiple Swift Packages β€’ Using SPM products in Cocoapods β€’ Cyclic dependencies between languages Migration challenges

Slide 40

Slide 40 text

SPM schemes management

Slide 41

Slide 41 text

β€’ Module migration status β€’ Product containers β€’ SPM Schemes management β€’ One or Multiple Swift Packages β€’ Using SPM products in Cocoapods β€’ Cyclic dependencies between languages Migration challenges

Slide 42

Slide 42 text

One package or multiple ones?

Slide 43

Slide 43 text

New Swift 5.9 Package Access modi f ier Private Open Public Internal Fileprivate Package πŸ†•

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

One package or multiple ones?

Slide 46

Slide 46 text

β€’ Module migration status β€’ Product containers β€’ SPM Schemes management β€’ One or Multiple Swift Packages β€’ Using SPM products in Cocoapods β€’ Cyclic dependencies between languages Migration challenges

Slide 47

Slide 47 text

Using SPM modules inside Cocoapods Can we do this? πŸ“¦ features Package πŸ“² XING App 🟦 Pod.xcodeProj MyCPModule Common https://github.com/CocoaPods/CocoaPods/pull/11953 πŸ’₯

Slide 48

Slide 48 text

Using SPM modules inside Cocoapods Yes, we can

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

β€’ Module migration status β€’ Product containers β€’ SPM Schemes management β€’ One or Multiple Swift Packages β€’ Using SPM products in Cocoapods β€’ Cyclic dependencies between languages Migration challenges

Slide 52

Slide 52 text

Cyclic dependencies between languages

Slide 53

Slide 53 text

Cyclic dependencies between languages Not allowed!

Slide 54

Slide 54 text

Conclusions

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

Evolution and status

Slide 57

Slide 57 text

$ bundle exec pod deintegrate

Slide 58

Slide 58 text

Thanks to all our mates Markus Faßbender Shammi Didla Andreas Koslowski Mark SchΓΌtte Γ–zgΓΌn Zor Eslam Foad Akshay Shetty