Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS-swift] 2. Protobuf (프로토콜 버퍼) 사용 방법 - Xcode 자동화, swift lint 비활성화, Build script, Shell Script 연동 (camelCase변환) 본문

iOS framework

[iOS-swift] 2. Protobuf (프로토콜 버퍼) 사용 방법 - Xcode 자동화, swift lint 비활성화, Build script, Shell Script 연동 (camelCase변환)

jake-kim 2022. 8. 8. 22:06

1. Protobuf (프로토콜 버퍼) 사용 방법 - 개념, 설치

2. Protobuf (프로토콜 버퍼) 사용 방법 - Xcode 자동화, Build script, Shell Script 연동

 

 

* 이 포스팅 글전에 이전 글, rotobuf (프로토콜 버퍼) 사용 방법 - 개념, 설치 참고

(아래 글에서 사용할 샘플용 시작 프로젝트 - 링크)

기본 지식) 리눅스 명령어

  • find와 같이 쓰이는 -exec
    • -exec: 조건을 가지고 찾은 파일들을 대상으로 다음 명령어를 실행
    • -exec는 세미콜론을 만나기 전까지 포함하므로, 명령의 끝에는 꼭 세미콜론이 필요
    • 주의) 세미콜론만 적으면 유닉스에서 명령어를 연속적으로 실행하라는 의미가 있으므로, (clear;ls하면 clear후 ls 명령어 실행)
      연속적으로 실행하지 말라는 의미를 위해 백슬래쉬(\)를 사용하여 끝을 표현
    • {} 의미: 찾은 파일들을 의미하며, 띄어쓰지 않고 붙여씀
find . -name "*pb.swift" -exec ls {} \;
find . -name "*pb.swift" -exec mv {} ../ExMyTest/Protobuf \;

Build Shell Script를 추가하여 자동화

  • 생성된 Protobuf이 위치할 파일들이 저장되는 폴더를 추가
    • 프로젝트 루트/프로젝트 이름/Protobuf

  • 폴더 추가
    • Protobuf - .proto 파일이 관리될 디렉토리
    • Scripts - 빌드 스크립트 파일이 관리될 디렉토리

  • Protobuf 디렉토리 안에는 이전 시간에 만들어둔 DataModel.proto가 존재
syntax = "proto3";

message BookInfo {
   int64 id = 1;
   string title = 2;
   string author = 3;
}
  • Scripts 폴더에 download-protobuf.sh 추가
cd Scripts
vi download-protobuf.sh
  • download-protobuf.sh 이 스크립트는 Xcode의 루트 경로에서 불린다고 생각하고 구현
    • .proto파일들은 Protobuf 폴더에서 관리되므로, 프로젝트 루트 바로 하위에 있는 Protobuf 로 이동하는 코드 추가
# download-protobuf.sh

echo "Run Protobuf"
cd Protobuf
  • 만약 *pb.swift"라는 이미 생성된 파일이 있다면 모두 삭제하는 코드 추가
# download-protobuf.sh

echo "Run Protobuf"
cd Protobuf
find . -name "*pb.swift" -exec rm {} \; # <-
  • protoc 컴파일러를 이용하여 auto gen 
    • auto gen할 때, .proto 타입의 여러 파일들이 존재할 수 있으므로 *.proto라고 선언
# download-protobuf.sh

echo "Run Protobuf"
cd Protobuf
find . -name "*pb.swift" -exec rm {} \;
protoc --swift_out=. ./*.proto # <-
  • 디버깅을 위해서 생성된 파일을 찍고, 그 파일들을 사용할 경로로 이동 (완성)
# download-protobuf.sh

echo "Run Protobuf"
cd Protobuf
find . -name "*pb.swift" -exec rm {} \;
protoc --swift_out=. ./*.proto

echo "------------------------Success Generate-------------------------" # <-
find . -name "*pb.swift" -exec ls {} \;
echo "-----------------------------------------------------------------"
find . -name "*pb.swift" -exec mv {} ../ExMyTest/Protobuf \;
  • 생성한 download-protobuf.sh는 permision denied 되어있기 때문에 변경

chmod [권한] [대상]

chmod 777 download-protobuf.sh
  • 프로젝트 루트에서 terminal로 실행
./Scripts/download-protobuf.sh

생성 완료
프로젝트 하위에도 생성

  • Xcode Target에도 추가

완료

  • 이전 프로젝트에서 만들어둔 DataModel.pb.swift 삭제하면 완료

Xcode 빌드 스크립트에도 추가

  • 앱을 빌드할때마다 .proto를 업데이트하여 자동화 구현하기
  • XCode > Target > Build Phases > +버튼을 클릭하여 New Run Scripts Phase로 빌드 스크립트 생성

  • 위에서 작성했던 빌드 스크립트를 이곳에다가도 적용
echo "Run Protobuf"
cd Protobuf
find . -name "*pb.swift" -exec rm {} \;
protoc --swift_out=. ./*.proto

echo "------------------------Success Generate-------------------------" # <-
find . -name "*pb.swift" -exec ls {} \;
echo "-----------------------------------------------------------------"
find . -name "*pb.swift" -exec mv {} ../ExMyTest/Protobuf \;

  • Xcode의 네비게이션 탭에서 9번째를 클릭하고, success를 검색해보면 로그 확인이 가능

SwfitLint를 사용한다면, Disabled 처리

* cf) SwiftLint 설치 SwiftLint관련 포스팅 글 참고

  • auto gen이므로, convention 에러가 발생할 수 있으므로, .swiftlint.yml파일에 아래 코드를 추가하여 lint warning, error 방지
excluded:
    - ExMyTest/Protobuf

Protobuf 패키지 설정

  • 보통 protobuf를 사용할때 패키지 관리를 위해서 아래처럼 package 라는 키워드로 설정을 하는데, 
    이대로 코드 gen을 하면 snake_case로 생성
syntax = "proto3";
pacakge my.company.proto;

option jave_package = "com.my.company";

message SomeModel {
   int64 id = 1;
   string title = 2;
   string author = 3;
}

snake_case로 자동 생성된 코드

  • 패키지 네임들을 camelCase로 변환하기 위해서 option swift_prefix를 사용
    • option swift_prefix = "PB"로 사용하면 앞 패키지 "My_Company_Proto_SomeModel"로 사용하지 않고 "PBSomeModel"로 사용
    • Apple에서 권장하는 prefix는 3글자 이상이지만, PB로만 해도 Protocol Buffer라는 것을 암시할 수 있고 간결
syntax = "proto3";
pacakge my.company.proto;

option jave_package = "com.my.company";
option swift_prefix = "PB";

message SomeModel {
   int64 id = 1;
   string title = 2;
   string author = 3;
}

PB 네임스페이스 변경된 화면

* 전체 코드: https://github.com/JK0369/-ExProtobuf-advanced

 

* 참고

https://github.com/apple/swift-protobuf

 

Comments