using cocoapods

30
Using CocoaPods Library Dependency Management for Xcode with Jeffrey Sambells http://JeffreySambells.com

Upload: jeffreysambells

Post on 26-Aug-2014

798 views

Category:

Self Improvement


0 download

DESCRIPTION

A quick introduction to using Cocoapods in an Xcode project. Demo Notes (in markdown): ## Using Cocoapods Demo 1. Create a new Single View project in Xcode called **MyProject**. 1. Create **Podfile** in project root. 1. Search [Cocoapods.org](http://Cocoapods.org) for a pod ([AFNetworking](http://cocoapods.org/?q=afnet)). 1. Point out features of web site. 1. Use clipboard icon to copy/paste AFNetworking. 1. Run `pod` in terminal (installation). 1. point out errors/warnings. 1. point out and explain loc file (bbedit **Podfile.lock**). 1. point out installed dependencies (if any). 1. point out **Pods.xcconfig**. 1. change the pod file (Remove AFNetworking and add [SVProgressHud](http://cocoapods.org/?q=svP)). 1. run `pod` again to see removal and updates. 1. Open **MyProject.xcworkspace** 1. Add a SVProgressHud call on **ViewDidAppear** of primary view controller. - (void)viewDidAppear:(BOOL)animated { [SVProgressHUD showSuccessWithStatus:@"It Worked!"]; } 12. Build and run the app. ## Creating Podspec Demo 1. Open and demonstrate **AwesomeProject**. 1. Decide to create a pod for **UIViewController+Alerts** category. 1. Show pod creation help in terminal: **`pod lib`** (note options). 1. Create a library on the ~/Desktop **`pod lib create iOSKW`**. 1. Explain the folder structure. 1. Copy in UIViewController+Alerts.h & .m files into **Classes/ios**. 1. run **`pod lib lint`**. 1. note warnings and errors. 1. Edit `bbedit iOSKW.podspec` as follows: Pod::Spec.new do |s| s.name = "iOSKW" s.version = "0.1.0" s.summary = "UIViewController Categories." s.homepage = "http://example.com" s.license = 'MIT' s.author = { "jsambells" => "[email protected]" } s.source = { :git => ".", :tag => s.version.to_s } s.platform = :ios, '7.0' s.requires_arc = true s.source_files = 'Classes/ios/*.{h,m}' s.frameworks = 'UIKit' end 1. Run `pod lib lint`. 1. Commit to local git repo. 1. Tag local git as **0.1.0** to match Podspec. 1. Re-run `pod lib lint` to verify 1. Create demo app called **Demo** on desktop and copy contents to the lib folder. 1. Remove empty targets from default Podfile (will error if you don't!). 1. Run `pod` in Project, note output. 1. Import `` header into primary view controller. 1. And add test code to view did load. - (void)viewDidLoad { [super viewDidLoad]; [self alert:@"HEllo!"]; } 1. Run demo app.

TRANSCRIPT

Page 1: Using Cocoapods

Using CocoaPodsLibrary Dependency Management for Xcode

with Jeffrey Sambells!http://JeffreySambells.com

Page 2: Using Cocoapods

Why CocoaPods?

Page 3: Using Cocoapods

+ =

Build dependencies

Header search path

Link binary with libraries

Libraries in version control

Cluttered project

Error-prone

Difficult upgrade path

No transitive dependencies

Page 4: Using Cocoapods

+ =+

Automatic add/remove Automatic build configuration

Handles ARC and no ARC

Separation of third-party code

Only includes the relevant source files

Project is always shippable!

Large ecosystem

Discoverability

Page 5: Using Cocoapods

Installation…

$ sudo gem update -- system

$ sudo gem install cocoapods

$ pod setup

Page 6: Using Cocoapods

Using CocoaPods in Xcode

Page 7: Using Cocoapods

Cocoapods Workflow1. Create your Podfile

2. Search for and add your dependencies

3. Run pod command

4. Open your new .xcworkspace (it will be created)

5. ???

6. Profit!

Page 8: Using Cocoapods

Creating the Podfile

$ cd /path/to/project/folder

$ touch Podfile

Page 9: Using Cocoapods

Simple

pod 'AFNetworking' pod 'ObjectiveSugar', '~> 0.5'

Page 10: Using Cocoapods

Advancedplatform :ios, '7.0' inhibit_all_warnings! !workspace 'Example.xcworkspace' !pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :commit => '082f8319af' !pod 'MySecretPod', :path => ‘~/Documents/MySecretPod' !pod 'BleedingEdgePod', :head !target :KIFTests, :exclusive => false do pod 'KIF' end !post_install do |installer| installer.project.targets.each do |target| puts "#{target.name}" end end

Page 11: Using Cocoapods

Install/Update into Project

$ cd /path/to/project/folder

$ pod

Hint: use pod --verbose if you want more info.

Page 12: Using Cocoapods

The Podfile and Dependencies

Page 13: Using Cocoapods

General SettingsSpecify a platform and minimum version

!

Optionally specify project and workspace files. For example MyProject.xcodeproj and

MyProject.xcworkspace

platform :ios, '6.1'

xcodeproj 'MyProject' workspace 'MyWorkspace'

Page 14: Using Cocoapods

Dependencies (Pods)• Specify pod name and other options as

necessary:

• Some pods use sub specs to group optional functionality so you need to specify them as well:

pod ‘PodName'

pod ‘PodName' pod ‘PodName/SubSpecA’ pod ‘PodName/SubSpecB‘

Page 15: Using Cocoapods

Pod Versioning x.x.x• References a specific git tag using a semantic version.

• Specify no version, a specific version, a logical version or an optimistic version.

• You can also use :head to get the most bleeding edge version.

pod ‘PodName’, :head

pod ‘PodName’ pod ‘PodName’, ‘0.1.0’ pod ‘PodName’, ‘<= 0.1.0’ pod ‘PodName’, ‘~> 0.1.0’

Page 16: Using Cocoapods

Logical Versions

• '> 0.1' Any version higher than 0.1

• '>= 0.1' Version 0.1 and any higher version

• '< 0.1' Any version lower than 0.1

• '<= 0.1' Version 0.1 and any lower version

Page 17: Using Cocoapods

Optimistic Versions

• '~> 0.1.2' Version 0.1.2 and the versions up to 0.2, not including 0.2 and higher

• '~> 0.1' Version 0.1 and the versions up to 1.0, not including 1.1 and higher

• '~> 0' Version 0 and higher, this is basically the same as not having it.

Page 18: Using Cocoapods

Pod SourcesPods load information from a podspec file.

The podspec files are located in…

• the shared public spec repo at https://github.com/CocoaPods/Specs,

• on your local machine,

• in a private git repo.

Page 19: Using Cocoapods

Public Shared Specs• you only need to specify the name:

• you can optionally specify a specific branch or fork:

• and a specific commit:

pod 'AFNetworking'

pod ‘AFNetworking’, :git => ‘https://github.com/iamamused/AFNetworking.git'

pod ‘AFNetworking’, :git => ‘https://github.com/myuser/AFNetworking.git', :commit => '082f8319af'

Page 20: Using Cocoapods

Local Podspecs

Load a podspec from your local machine using :path

pod ‘MyAwesomePod’, path: => ‘../path/MyAwesomePod.podspec’

Page 21: Using Cocoapods

Private Podspecs

Load a podspec from a private git repository using :git (simiar to public specs)

pod ‘MyAwesomePod’, git: => ‘http://example.com/MyAwesomePod.git’

Page 22: Using Cocoapods

Bonus

Code doesn’t have a pod? no problem. Make your own pod spec for it and use that:

!

!pod 'ExampleKit', :podspec => 'https://raw.github.com/gist/123/ExampleKit.podspec'

Page 23: Using Cocoapods

Targets

Targets allow you to specify which Xcode target have which pod dependencies.

Pod dependencies are applied to individual or multiple targets.

If no specific target is specified it only applies to the first target in your project!

Page 24: Using Cocoapods

TargetsUse link_with to specify multiple targets for all

pod dependencies:

pod ‘PodName’ link_with [‘MyApp’,’MyAppDemo’]

Page 25: Using Cocoapods

TargetsOr use target :targetname to specify targets

individually:

!

!

• exclusive => true will only include pods declared in the target block.

• exclusive => false will include pods declared in the target block along with those declared in the parent.

pod ‘PodName’ target :test, :exclusive => true do pod 'Kiwi' end

Page 26: Using Cocoapods

Hookspre_install

Make any changes to the Pods after they have been downloaded but before they are installed.

!!

pre_install do |installer_representation| # Do something fancy! end

Page 27: Using Cocoapods

Hookspost_install

Make any changes to the generated Pods project, or any other tasks you might want to perform.

!

post_install do |installer_representation| installer_representation.project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['GCC_ENABLE_OBJC_GC'] = 'supported' end end end

Page 28: Using Cocoapods

Pod Best Practices

• Check the source, documentation and upkeep of a pod! Don’t blindly use them.

• Include pods in source control? NO! err YES!

• Use inhibit_all_warnings! to hide warnings in Pods (after you check them).

Page 29: Using Cocoapods

DEMO TIME!

Page 30: Using Cocoapods

Thanks!

More Info"

cocoapods.org

JeffreySambells.com

@iamamused