Slide 1

Slide 1 text

Dependency Management With Carthage Abizer Nasir | @abizern | abizern.org

Slide 2

Slide 2 text

! How to use Carthage to manage dependencies. How to write a dependency that can be used with Carthage. How to make working with Carthage a little easier.

Slide 3

Slide 3 text

! Whether or not dependencies are a good thing. Cocoapods.

Slide 4

Slide 4 text

Yet Another Dependency Manager

Slide 5

Slide 5 text

Git Git is a lot of things, but it’s not a dependency manager.

Slide 6

Slide 6 text

Cocoapods Code is stored in a central location 1. The code is built into a framework that is added to the project workspace. 1 They don’t have to be.

Slide 7

Slide 7 text

Swift Package Manage Library locations are specified in Package file. Builds dependencies as libraries (the irony!). Only for Desktop.

Slide 8

Slide 8 text

Carthage Developed after Swift and framework support in iOS. Dynamic libraries built according to their own project settings. Dependencies are dynamic frameworks and supported by OS X and iOS 2. 2 All versions of OS X, iOS 8+

Slide 9

Slide 9 text

Decentralised and designed for simplicity. You need to find third party projects yourself. You need to integrate the code into your project manually. Doesn’t (and probably won’t) do a lot of cool stuff that Cocoapods can do.

Slide 10

Slide 10 text

Getting Carthage

Slide 11

Slide 11 text

Install Binary release. https://github.com/Carthage/Carthage/releases

Slide 12

Slide 12 text

Install using Homebrew (recommended) brew update && brew install carthage You may need to use xcode-select to choose the correct version of Xcode/Swift to build the tool.

Slide 13

Slide 13 text

What Does Carthage do? » Takes a list of dependencies, that may have their own dependencies. » Resolves versions semantically. » Fetches the dependencies at the correct versions. » Builds them with their own project settings - (optional).

Slide 14

Slide 14 text

That’s it! The rest is up to you!

Slide 15

Slide 15 text

Adding Dependencies (Recommended3) » Specify dependencies in the Cartfile. » Fetch and build the dependencies. » Link the frameworks to the correct target. » Copy the dSYM files to the target. » Add a workaround script for iOS targets. 3 As recommended by the documentation, but not the only way.

Slide 16

Slide 16 text

Cartfile - Specify public dependencies. github “ReactiveCocoa/ReactiveCocoa” >= 2.3.1 github “Mantle/Mantle” ~> 1.0 github “jspahrsummers/libextobjc” == 0.4.1 #arbitrary server git “https://enterprise.local/desktop/git-error-translations.git” “development” #local file git “file:///directory/to/project” “branch”

Slide 17

Slide 17 text

Normal Semantic versioning rules. » >= 1.0 for “at least version 1.0” » ~> 1.0 for “compatible with version 1.0” » == 1.0 for “exactly version 1.0” » some-branch-or-tag-or-commit for a specific Git object (anything allowed by git rev-parse)

Slide 18

Slide 18 text

Cartfile.private Same format as the Cartfile. Dependencies that your project needs that aren’t necessary for it to be used. These are not shared upstream. For example; things you need for testing, things you need for building.

Slide 19

Slide 19 text

Cartfile.resolved This is where the actual versions to be used are written to. If you’re familiar with gemfile.lock, podfile.lock, you know what these are.

Slide 20

Slide 20 text

Demo Using Carthage

Slide 21

Slide 21 text

carthage update Resolves dependencies and builds them. If you only want to update one or some dependencies. Carthage update xxx

Slide 22

Slide 22 text

carthage help update Update and rebuild the project's dependencies [--configuration (string)] the Xcode configuration to build (ignored if --no-build option is present) [--platform (platform)] the platforms to build for (one of ‘all’, ‘Mac’, ‘iOS’, ‘watchOS’, 'tvOS', or comma-separated values of the formers except for ‘all’) (ignored if --no-build option is present) [--derived-data (string)] path to the custom derived data folder [--verbose] print xcodebuild output inline (ignored if --no-build option is present) [--no-checkout] skip the checking out of dependencies after updating [--no-build] skip the building of dependencies after updating (ignored if --no-checkout option is present) [--use-ssh] use SSH for downloading GitHub repositories [--use-submodules] add dependencies as Git submodules [--no-use-binaries] check out dependency repositories even when prebuilt frameworks exist, disabled if --use-submodules option is present (ignored if --no-build option is present) [--color (color)] whether to apply color and terminal formatting (one of ‘auto’, ‘always’, or ‘never’) [--project-directory (string)] the directory containing the Carthage project [[]] the dependency names to update, checkout and build

Slide 23

Slide 23 text

carthage bootstrap Uses Cartfile.resolved to build dependencies. This is what is usually used when checking out a project. Note: If you are using submodules update the submodules first and then run build: git submodule update --init carthage build

Slide 24

Slide 24 text

def run(command) system(command) or raise "RAKE TASK FAILED: #{command}" end namespace "carthage" do desc "Bootstrap carthage dependencies" task :bootstrap do |t| run "git submodule update --init" run "carthage bootstrap --use-submodules --platform ios" end desc "Update carthage dependencies" task :update do |t| run "carthage update --use-submodules --platform ios" end end task :default do system "rake -T" end

Slide 25

Slide 25 text

carthage build Just builds what you have already. This is useful if you are using submodules.

Slide 26

Slide 26 text

Writing modules » Share your build schemes » Link any dependencies, don’t add them to the bundle. » When writing a Foundation module, create a separate target for iOS and Mac, tvOS, watchOS (takes some tweaking, but it can be done).

Slide 27

Slide 27 text

Demo Writing a Framework for Carthage

Slide 28

Slide 28 text

Artefacts Cartfile, Cartfile.resolved should be checked in to version control Carthage/Checkouts, Carthage/Build - It depends Use submodules and Carthage/Checkouts problem goes away.

Slide 29

Slide 29 text

When things go wrong ! Because they will! - Check what compiler you are using with xcode-select -p - fix your build with carthage build --no-skip-current, build the scheme to see more detailed errors. - Blitz Carthage folder and Cartfile.resolved - Blitz the cache at ~/Library/Caches/carthage - Bitcode!

Slide 30

Slide 30 text

When it all goes completely wrong! !! Because it will! » Change the Carthage update method to use submodules and not build. » Remove the linked frameworks. » Drag the dependency project files into your project and build it “old school”.

Slide 31

Slide 31 text

So...

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

Simple

Slide 35

Slide 35 text

Easy

Slide 36

Slide 36 text

Carthage is simple, not easy. CocoaPods is easy, not simple.

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

Git

Slide 39

Slide 39 text

Thank You Abizer Nasir | @abizern | abizern.org