ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 존재하는 프로젝트cocoapod private용으로 배포 하기
    개발/Swift 2021. 12. 27. 17:33

    구글검색후 찾았던 cocoapod 배포 방법과 달리

    나는 이미 존재 하는 프로젝트를 cocoapod 으로 배포 하고싶었다.

    대부분의 예시에서는 애초에 시작을 프레임워크로 만들어 제공된

    템플릿 안에서 구현하였다. 결론 부터 말하자면 이렇게 하는게 맞았다.

    삽질하기(기존 프로젝트 기존 깃에서 그냥 올리기)

    하지만 좀 복잡하기보다 간단하게 해결하고싶어서 해당 방법을 찾았었다.

    존재하는 프로젝트 경로에서

    pod spec create POD이름
    

    를 실행한다. 그러면 POD이름.podspec 파일이 생긴다.

    podspec 을 보면 여러 세팅값들이 있는데 이중에서 내 프로젝트의 git 주소를 넣어준다.

    s.source           = { :git => '깃주소', :tag => s.version.to_s }
    

    변경 후에 pod spec lint 돌려본다. 유효성 검사라 보면된다.

    -> ModiSdk (0.0.1)
        - ERROR | license: Sample license type.
        - WARN  | github_sources: Github repositories should end in `.git`.
        - WARN  | summary: The summary is not meaningful.
        - ERROR | description: The description is empty.
        - ERROR | [OSX] unknown: Encountered an unknown error (The `ModiSdk` pod failed to validate due to 2 errors:
        - ERROR | license: Sample license type.
        - WARN  | github_sources: Github repositories should end in `.git`.
        - WARN  | summary: The summary is not meaningful.
        - ERROR | description: The description is empty.
    

    에러가 난 부분을 수정하면 된다. 경고는 일단 무시해줘도 괜찮다.

    1. 라이센스는 “MIT” 라적어줬고
    2. Description을 작성했다.
    spec.license      = "Apache License, Version 2.0"
    
    spec.description  = <<-DESC
                            SDK for ble connection with MODI, This SDK provides bluetooth function such as scan connection and interaction with MODI.
                            DESC
    
    

    이후에 또 이런 에러가 발생하였다.

    - ERROR | [OSX] unknown: Encountered an unknown error ([!] /usr/bin/git clone <https://github.com/LUXROBO/modi-sdk-ios.git> /var/folders/mr/3y8xy9g934zbvrkmk_10hq440000gn/T/d20211221-17185-1amobo0 --template= --single-branch --depth 1 --branch 0.0.1
    
    Cloning into '/var/folders/mr/3y8xy9g934zbvrkmk_10hq440000gn/T/d20211221-17185-1amobo0'...
    warning: Could not find remote branch 0.0.1 to clone.
    fatal: Remote branch 0.0.1 not found in upstream origin
    

    제공한 깃주소 (레포지토리) 에 0.0.1 태그가 없었다.

    현재 깃에는 0.2.0 태그가 올라가있어서 버전을 0.2.0으로 수정했다.

    s.version = '0.2.0'
    

    이후에는 이런에러가 발생했다. source_file 에 제공된 파일 경로에 아무것도 없다는것인데.

    - ERROR | file patterns: The `source_files` pattern did not match any file.
    
    spec.source_files  = "Classes", "Classes/**/*.{h,m}"
    

    애초에 프레임워크 용으로 만들었다면 괜찮겠지만 나는 기존 프로젝트를 가지고 하는거라

    Classes라는 폴더가 없었다.

    하지만 .h 로끝나는파일이 루트 /ios_modi_network_sdk 안에 있었기 떄문에

    경로를 수정해줬다.

    spec.source_files  = "Classes", "ios_modi_network_sdk/*.{h,m}"
    

    이렇게 변경하니 에러 사라졌다.

    그리고 나머지 워닝들은 —allow-warnings 로 해결 할수있다.

    pod spec lint --allow-warnings
    

    이후 배포하기 전에 메일을 등록해주고

    pod trunk register khdrogba@gmail.com hwikang
    
    pod trunk push ModiSdk.podspec --allow-warnings
    

    경고 무시하고 push 하면 pod 에 배포가 올라간다.

    이제 사용하려는 프로젝트에 가서 pod 추가 후 pod install을 해보니

    정상 install이 됬음을 확인할수있다.

    하지만 빌드성공 후에 이런 에러가나며 크러쉬가 발생했다

    dyld: Library not loaded: @rpath/ios_modi_network_sdk.framework/ios_modi_network_sdk
      Referenced from: /private/var/containers/Bundle/Application/924A92DD-4284-4488-B4EE-45E2259ACB57/ModiPlay-v2.app/ModiPlay-v2
      Reason: image not found
    dyld: launch, loading dependent libraries
    DYLD_LIBRARY_PATH=/usr/lib/system/introspection
    DYLD_INSERT_LIBRARIES=/Developer/usr/lib/libBacktraceRecording.dylib:/Developer/usr/lib/libMainThreadChecker.dylib:/Developer/Library/PrivateFrameworks/DTDDISupport.framework/libViewDebuggerSupport.dylib
    (lldb)
    

    그러던중 pod을 사용한 프로젝트 내부에서 Pods 폴더에는 ModiSdk(내가 배포한것) 가 있지만

    Products 폴더 에는 없음을 발견했다.

    애초에 프로젝트가 프레임워크로 만들어진게 아니라 그런지 해당 문제에서 원인을 파악하지 못했다.

    결국 다시 처음부터 돌아가 다시 만들기로 했다.

     

    처음부터 만들기

     

    프로젝트 를 프레임워크 용으로 다시 만들고 깃을 새로파서 private용으로 배포할것이다.

    pod lib create 프로젝트명
    
    

    이렇게 실행하면 프레임워크용 프로젝트가 만들어진다.

    프로젝트 안에 podspec이 들어있다.

    이후에 podspec 파일 수정(위와 같이 경로,깃주소,설명,버전 등등을 수정함) 을 했고

    private 리포지토리 개설후에 이것들을 실행한다.

    pod spec lint
    pod repo add 리포지토리네임 리포지토리 url
    por repo push 리포지토리네임 podspec이름
    

    이렇게 repository에 podspec을 push 해준다.

    pod spec lint 에서 나는 오류들은 위에서 기재한 방식과 동일하게 해결해줬다.

    Pods → Development Pods에 Replaceme.swift 파일을 지우고

    제공된 Classes 폴더 자체를 프로젝트에 넣어주었다.

    그리고 podspec 에서 파일경로는 이렇게 지정해줘야 에러가 발생하지 않았다.

    s.source_files = '**/Classes/*.{swift}'
    

    여기에 이제 기존 프로젝트에 있던 swift 파일들을 Classess 폴더에 옮겨담았다.

    옮겨담은 파일에는 다른 Pod 들을 필요로 했다.

    rxswift , rxbluetoothkit 등등... 이것들은 podfile에 추가해봤자 Classes 안에서는 읽지못했다.

    이것들은 podspec 에서 넣어줘야한다.

    s.dependency 'SwiftLint' , 
       s.dependency 'RxCocoa' , 
       s.dependency 'RxSwift' 
       s.dependency 'Moya/RxSwift'
       s.dependency 'RxBluetoothKit' 
    
    

    이후 다시 수정사항들을 git에 푸쉬해준후

    새로운 태그를 달아준후에 podspec에서 새로운 태그 버전을 다시 달아준 다음 이것들을

    다시 실행해준다.

    pod spec lint
    pod repo add 리포지토리네임 리포지토리 url
    por repo push 리포지토리네임 podspec이름 --allow-warnings
    

    이러면 새 코드와 , 태그가 올라간 상태이다.

    새로운 버전을 올릴때마다

    podspec파일이 계속 저장됨을 볼수있다.

    이제 사용할 프로젝트에 가서

    pod repo update
    pod install
    

    을 하여 새로운 버전을 설치해준다.

    pod install 시 이전 버전을 받아올수있으니

    push 이후 조금 기다렸다가 실행하는게 좋다.

    댓글

Designed by Tistory.