Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- RxCocoa
- swift documentation
- Refactoring
- uiscrollview
- SWIFT
- Observable
- 리펙터링
- 애니메이션
- 스위프트
- combine
- 리팩토링
- ribs
- swiftUI
- uitableview
- UITextView
- tableView
- collectionview
- Xcode
- Clean Code
- ios
- Protocol
- rxswift
- clean architecture
- HIG
- MVVM
- UICollectionView
- 클린 코드
- 리펙토링
- map
- Human interface guide
Archives
- Today
- Total
김종권의 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:061. 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;
}
- 패키지 네임들을 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;
}
* 전체 코드: https://github.com/JK0369/-ExProtobuf-advanced
* 참고
https://github.com/apple/swift-protobuf
'iOS framework' 카테고리의 다른 글
Comments