Git, CocoaPods, Xcode, Shell

[iOS - swift] GitHub 깃 허브 contribute 방법 (컨트리뷰트, cocoapods 수정해서 사용하는 방법)

jake-kim 2022. 4. 17. 22:02

예제로 사용할 오픈소스 - Then

  • 초기화하는 동시에, 클로저를 통해서 해당 인스턴스의 프로퍼티에 접근하여 코드를 깔끔하게 구현할 수 있는 오픈소스
// then 사용하지 않은 일반 코드
private let label: UILabel = {
  let label = UILabel()
  label.text = "label"
  label.translatesAutoresizingMaskIntoConstraints = false
  return label
}()

// then 사용
private let label = UILabel().then {
  $0.text = "label"
  $0.translatesAutoresizingMaskIntoConstraints = false
}
  • 오픈소스에 없는 코드를 오픈소스에 추가하여 사용하는 방법

ex) JsonDecoder에 then extension을 사용하여 아래 코드 중 decoder부분 수정

struct MyDate: Codable {
  let todayDate: String?
}

class ViewController: UIViewController {
  let json = """
    { "today_date": "2022-04-11T15:25:47.929Z" }
  """
  
  override func viewDidLoad() {
    super.viewDidLoad()
    
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    
    do {
      guard let data = json.data(using: .utf8) else { fatalError() }
      let myDate = try decoder.decode(MyDate.self, from: data)
      print(myDate)
    } catch {
      print(error)
    }
  }
}
  • 아래처럼 수정해서 사용하는 방법
let decoder = JSONDecoder().then {
  $0.keyDecodingStrategy = .convertFromSnakeCase
}
  • extension으로 단순히 추가해도 되지만, 오픈소스에 추가해서 사용하는 방법은 아래에서 계속
extension JSONDecoder: Then {}

cocoapods 수정해서 사용하는 방법

  • 오픈소스 github 레포를 fork뜨기
    (fork를 뜨는 이유 - 다른 레포에 PR을 날릴려면 fork를해야 해당 레포에 PR을 날릴 수 있기 때문)
    • github 레포에 가서 Fork 버튼 클릭

  • Create Fork 클릭

  • 위에서 Repository name에 Then으로 적었으므로, 내 레포에 Then이라는 레포가 생성
    • (source tree 사용)

  • 해당 레포를 clone하여 브랜치를 새로 생성

add-extension이라는 브랜치 생성한 상태

  • JSONDecoder와 추가로 JSONEncoder도 추가한 상태

  • 자신의 레포에 push
    • "Add extension for JSONDecoder and JSONEncoder"

  • 해당 commit 확인 및 복사 (cocoapods에서 사용하기 위해 필요)
7631938978a6035be33c77f85c5d4707d27131a5 [7631938]
  • podfile에 아래처럼 작성했던 부분을 수정
    • pod 'Then'이라고 되어있던 부분을 수정
    • pod 'Then', :git => 'fork한 깃헙 주소', commit: => '위에서 변경된 부분의 커밋'

수정 전)

target 'ExThen' do
  use_frameworks!
  pod 'Then'
end

수정 후)

target 'ExThen' do
  use_frameworks!
  pod 'Then', :git => 'git@github.com:JK0369/Then.git', :commit => '7631938'
end
  • pod install하여 설치
    • 이제 framework에 내장되어 있으므로 따로 extension하지 않아도 JSONDecoder에도 바로 사용 가능
let decoder = JSONDecoder().then {
  $0.keyDecodingStrategy = .convertFromSnakeCase
}

contribute 방법

  • 위에서 Push한 내용을 기존 오픈소스의 브랜치로 PR날리면 완료

* 참고

https://github.com/devxoul/Then