본문 바로가기

iOS/develop

Swift Custom Framework 만들기(3) - Private Cocoapods

Swift Custom Framework 만들기(2)에서 만들었던 라이브러리를 추가하여 사용해 보겠습니다.

임의의 프로젝트를 만든후 해당 폴더에서 아래 커맨드를 입력해줍니다.

pod init
pod install

그리고 [프로젝트명].xcworkspace 를 실행시켜줍니다.

이제 pod 파일에 이전에 만든 라이브러리를 추가해주는데 명령어에 git 주소와 tag 버전도 추가해줍니다.

pod "프로젝트명", :git => '깃주소', :tag => '버전'

그 다음 다시 pod install을 하면

pod install

 

설치된 것을 확인할 수 있습니다.

 


이제 pod 을 활용하여 라이브러리에 이미지도 추가도 해보고,

업데이트도 진행해보겠습니다.

 

먼저, pod lib의 폴더로 이동한 후 _Pods.xcodeproj 실행합니다.

실행 후 YGLib.podspec 파일의 s.version 을 변경해 줍니다.

또한 사용할 bundleId와 , resoure 파일들을 위해 추가해줍니다.

 

(저는 0.2.0 -> 0.3.0으로 변경하겠습니다.)

s.info_plist = {

    'CFBundleIdentifier' => '번들 ID '

  }

s.resource_bundles = {

     'Rep이름' => ['Rep이름/Assets/*.png']

  }

Pod::Spec.new do |s|
  s.name             = 'YGLib'
  s.version          = '0.3.0'
  s.summary          = '테스트용 라이브러리'
  s.description      = '테스트용 라이브러리 입니다.'
  s.homepage         = 'https://github.com/daddy73e'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'daddy73e' => 'daddy73e@gmail.com' }
  s.source           = { :git => 'https://github.com/daddy73e/YGLib.git', :tag => s.version.to_s }
  
  s.ios.deployment_target = '9.0'
  s.source_files = 'YGLib/Classes/**/*'
  
  s.info_plist = {
    'CFBundleIdentifier' => 'org.cocoapods.YGLib'
  }
  s.resource_bundles = {
     'YGLib' => ['YGLib/Assets/*.png']
  }
end

 

그리고 테스트로 사용할 Classes > YGViewController를 추가하겠습니다.

그리고 해당 YGViewController에 사용할 이미지파일을 Assets에 추가하고, 프로젝트에도 추가해줍니다.

*그리고 Add to targets에 [프로젝트] 체크박스도 꼭 체크해줍니다.

xib 파일에 이미지를 추가해주고 

 

YGViewController는 모두 public으로 선언해줍니다.

import UIKit

public class YGViewController: UIViewController {
    public override func viewDidLoad() {
        super.viewDidLoad()
    }
}

 

YGLibTest.swift에 YGViewController 를 가져오는 소스를 추가해 줍니다.

import UIKit

public class YGLibTest: NSObject {
    public func callLib() {
        print("call from YGLib")
    }
    
    public func getYGViewController() -> YGViewController {
        let bundleId = "org.cocoapods.YGLib"
        let libBundle = Bundle.init(identifier: bundleId)
        return YGViewController(nibName: "YGViewController",
                                bundle: libBundle)
    }
}

 

이제 git을 업데이트 해줍니다. (위 소스에서도 여러번 실수하여 저는 0.4.2으로 추가 업데이트 하였습니다. ^^;;;)

git add .
git commit -m "add YGViewController"
git tag 0.4.2
git push origin 0.4.2

 

~/.cocoapods/repos/[프로젝트] 또한 해당 커맨드를 통해 업데이트 해줍니다.

pod repo push YGLib /Users/yeongeunsong/lib/YGLib/YGLib.podspec --allow-warnings

Example프로젝트 또는 사용하고있는 project에서 pod 파일을 수정하고 pod update를 호출합니다.

pod update

Product > Clean Build Folder 를 한 후 다시 Run하면 

 

 

오잉 ?? 이미지 뷰를 넣었는데 이미지가 나오지 않았네요...

다시 lib pod 프로젝트로 가서 수정해 줍니다.

 

*해결방법중 하나는  해당 리소스에서 Target Membership에 [프로젝트]타겟의 체크박스에 체크해주고 Product > Clean Build Folder 하고 다시 Run하면 됩니다.

 

* 다른 방법은 Pod lib에서 [프로젝트명].podspec 파일에

s.resources = ['[Repo명]/Assets/*.png'

을 추가합니다.

Pod::Spec.new do |s|
  s.name             = 'YGLib'
  s.version          = '0.3.0'
  s.summary          = '테스트용 라이브러리'
  s.description      = '테스트용 라이브러리 입니다.'
  s.homepage         = 'https://github.com/daddy73e'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'daddy73e' => 'daddy73e@gmail.com' }
  s.source           = { :git => 'https://github.com/daddy73e/YGLib.git', :tag => s.version.to_s }
  
  s.ios.deployment_target = '9.0'
  s.source_files = 'YGLib/Classes/**/*'
  
  s.info_plist = {
    'CFBundleIdentifier' => 'org.cocoapods.YGLib'
  }
  s.resources = ['YGLib/Assets/*.png']
  s.resource_bundles = {
     'YGLib' => ['YGLib/Assets/*.png']
  }
end

그리고 해당 리소스의 Target Membership에 해당 프레임워크 부분도 체크해줍니다.

이전과 같이 git을 업데이트하고,

~/.cocoapods/repos/[프로젝트] 또한 업데이트 합니다.

git add .
git commit -m "resource update"
git tag 0.4.3
git push origin 0.4.3
pod repo push YGLib /Users/yeongeunsong/lib/YGLib/YGLib.podspec --allow-warnings

그리고 시뮬레이터 cache로 됐다 안됐다 하는경우 있는데 그럴경우 pod을 지웠다 설치하거나 

아니면 Product > Clean Build Folder 하고 다시 Run하면 될거에요 :) 

IT회사중 이렇게 pod으로 라이브러리나 Framework 를 관리하는 회사는 큰 회사, 아니면 스타트업일겁니다.

두 세개의 서비스를 하고 있는 회사여도 이런식으로 프레임워크화, 라이브러리화 하지 않고 Copy & Paste 만 하면서

소스를 관리한다면 언젠가는 정리가 필요할때가 올 것이고, 그때 더 많은 시간을 소요할 것입니다.

그때가 오기전에 작은 모듈부터 라이브러리화 하여 관리한다면 앞으로의 고생을 덜 할 수 있을 것입니다.

 

https://github.com/daddy73e/YGLib