CocoaPods

Objective-C အတွက် Dependency Manager
ရေးသားသူ : saturngod

CocoaPods က Objective-C အတွက် Dependency Manager တစ်ခုပါ။ ruby မှာဆိုရင် gem , node.js မှာဆိုရင် npm , python မှာဆိုရင် Pip , php မှာဆိုရင် composer စတာတွေ ရှိပါတယ်။ Objective C အတွက် ကျွန်တော်တို့တွေ CocoaPods ကို အခြား language က package manager တွေမျိုး လွယ်လင့် တကူ အသုံးပြုနိုင်ပါတယ်။

Install

CocoaPods ကို သွင်းပြီး ruby gem ကနေ သွင်းရပါမယ်။ Mac OSX မှာ ruby ကော gem ပါရှိပြီးသားအတွက် ဘာမှ ထပ်သွင်းစရာမလိုပါဘူး။ Terminal ဖွင့်ပြီး အောက်က command တွေ ရေးလိုက်ရင် အဆင်ပြေပါတယ်။

$ [sudo] gem install cocoapods
$ pod setup

Get Start

ကျွန်တော်တို့ Xcode project ရှိတဲ့ အောက်မှာ Podfile တစ်ခု ဆောက်ပါမယ်။ Terminal ဖွင့်ပြီး အောက်ကလို ရိုက်တာ ဖြစ်ဖြစ် နှစ်သက်ရာ editor ဖွင့်ပြီး Podfile တစ်ခု သိမ်းဖို့လိုပါတယ်။

$ edit Podfile
platform :ios, '6.0'
pod 'JSONKit',   '~> 1.4'
pod 'Reachability',  '~> 3.0.0'

အထက်ပါ Example Podfile မှာ JSONKit 1.4 နဲ့ Reachability 3.0 ကို သုံးမယ်ဆိုပြီး ရေးထားတာပါ။ လွယ်ပါတယ်။ pod file တွေကို CocoaPods site မှာ သွားရှာနိုင်ပါတယ်။ အများအားဖြင့် လူသုံးများပြီး နာမည်ကြီးတဲ့ library တွေဟာ podfile တွေ ရှိကြပါတယ်။

ပြီးသွားပြီဆိုရင် pod တွေကို install သွင်းဖို့

$ pod install

အစအဆုံး pod file တွေ ဖွင့်ပြီးသွားရင်တော့ မူရင်း project အစား App.xcworkspace ကို ဖွင့်ဖို့လိုပါတယ်။ App.xcworkspace မှာ လက်ရှိ project နဲ့ pod တွေ ထည့်ထားတဲ့ project ၂ ခု ပါပါလိမ့်မယ်။ လက်ရှိ project ကို ဒီအတိုင်း ဆက်ရေးလို့ရပါတယ်။ JSONKit pod ထည့်ထား လက်ရှိရေးနေတဲ့ project ရဲ့ .h သို့မဟုတ် .m မှာ #import “JSONKit.h” ဆိုပြီး ထည့်လို့ရပါတယ်။

How to create a pod

ကိုယ့် Library ကို pod ပြောင်းချင်တယ်ဆိုရင်တော့ podspec လိုပါတယ်။ ကျွန်တော်တို့ရဲ့ လက်ရှိ project name က penut ဆိုပါစို့။

$ pod spec create Peanut
$ edit Peanut.podspec
$ pod spec lint Peanut.podspec

အခြား ဥပမာ အနေနဲ့ AFNetworking ရဲ့ AFNetworking.podspec ကတော့

Pod::Spec.new do |s|
  s.name = 'AFNetworking'
  s.version  = '1.3.2'
  s.license  = 'MIT'
  s.summary  = 'A delightful iOS and OS X networking framework.'
  s.homepage = 'https://github.com/AFNetworking/AFNetworking'
  s.authors  = { 'Mattt Thompson' => 'm@mattt.me', 'Scott Raymond' => 'sco@gowalla.com' }
  s.source   = { :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => '1.3.2' }
  s.source_files = 'AFNetworking'
  s.requires_arc = true

  s.ios.deployment_target = '5.0'
  s.ios.frameworks = 'MobileCoreServices', 'SystemConfiguration', 'Security', 'CoreGraphics'

  s.osx.deployment_target = '10.7'
  s.osx.frameworks = 'CoreServices', 'SystemConfiguration', 'Security'

  s.prefix_header_contents = <<-EOS
#import <Availability.h>

#if __IPHONE_OS_VERSION_MIN_REQUIRED
  #import <SystemConfiguration/SystemConfiguration.h>
  #import <MobileCoreServices/MobileCoreServices.h>
  #import <Security/Security.h>
#else
  #import <SystemConfiguration/SystemConfiguration.h>
  #import <CoreServices/CoreServices.h>
  #import <Security/Security.h>
#endif
EOS
end

SVProgressView ရဲ့ SVProgressHUD.podspec ကတော့

``` Pod::Spec.new do |s| s.name = ‘SVProgressHUD’ s.version = ‘0.9’ s.platform = :ios s.license = ‘MIT’ s.summary = ‘A clean and lightweight progress HUD for your iOS app.’ s.homepage = ‘http://samvermette.com/199‘ s.author = { ‘Sam Vermette’ => ‘hello@samvermette.com’ } s.source = { :git => ‘https://github.com/samvermette/SVProgressHUD.git‘, :tag => s.version.to_s }

s.description = ‘SVProgressHUD is an easy-to-use, clean and lightweight progress HUD for iOS. It’s a simplified and prettified alternative to the popular MBProgressHUD. The success and error icons are from Glyphish.’

s.source_files = ‘SVProgressHUD/*.{h,m}’ s.framework= ‘QuartzCore’ s.resources= ‘SVProgressHUD/SVProgressHUD.bundle’ s.requires_arc = true end

ပြီးသွားတဲ့ အခါ ကိုယ့်ရဲ့ podspec ကို Ticket လုပ်ပေးဖို့ လိုပါတယ်။ သူတို့ စစ်ဆေးပြီးသွားရင် cocopods library list တွေထဲမှာ ထည့်သွင်းပေးပါလိမ့်မယ်။

တကယ်လို့ cocopods ကို မသုံးဘူးစေးရင်း စမ်းသုံးကြည့်ပါ။ သုံးရတာ အဆင်ပြေတာကို တွေ့ရပါလိမ့်မယ်။ ကျွန်တော်ကတော့ အရင်တုန်းက CocoaPods ကို မသုံးပေမယ့် အခုနောက်ပိုင်း project တွေမှာ ထည့်သုံးလာပါတယ်။ CocoaPods သုံးတဲ့အတွက် External Dependency library နဲ့ လက်ရှိ code ဟာ မရောထွေးတော့ပဲ သီးသန့်ဆီဖြစ်သွားပါတယ်။ နောက်ပြီးတော့ git အသုံးပြုရင်လည်း pod တွေရှိတဲ့ folder ကို ignore လုပ်ပြီး code ကို submit လုပ်ပါတယ်။ အခြားလူက clone လုပ်ရင် CocoaPods ကို သွင်းပြီး projects မှာ သုံးထားတဲ့ Dependency library တွေအကုန် download ဆွဲလို့ရပါတယ်။ Project ကို git ပေါ် တင်ရာမှာ Dependency Library တွေ မပါတော့တဲ့ အတွက်ကြောင့် တင်ရတာမြန် သလို download ပြန်ဆွဲရတာလည်း မြန်ပါတယ်။ Pull ဆွဲပြီးရင် pod install လို့လုပ်လိုက်တာနဲ့ လိုအပ်တဲ့ Dependency Library အကုန် သွင်းသွားတဲ့အတွက် ခက်ခက်ခဲ ခဲ မရှိလှပါဘူး။ နောက်ပြီးတော့ library တွေကိုလည်း လွယ်လင့် တကူ update လုပ်လို့ရလာတဲ့အတွက် Project ကို update to update library တွေဖြစ်အောင် လွယ်လင့်တကူ ပြုလုပ်လို့ ရတဲ့အတွက်ကြောင့် developer တွေ အနေနဲ့လည်း သက်သာလှပါတယ်။