티스토리 뷰
저번에 SwiftLint를 써보았으니, 오늘은 SwiftFormat을 써보려고 합니다!
(* SwiftLint가 궁금하시다면 이쪽으로!)
SwiftFormat 시작하기
https://github.com/nicklockwood/SwiftFormat
SwiftFormat도 Readme에 설치부터 사용까지 잘 설명해주고 있어요.
설치는 Homebrew, Mint, Cocoapods, Swift Package Manager까지 다양한 방법을 제공하고 있고, 저는 이번에도 Cocoapods를 사용해서 설치를 해보려고 합니다.
Cocoapods을 통한 설치
*참고: 코코아팟을 통해 설치하는 것은 SwiftFormat framework의 소스코드를 받는것은 아니고, 미리 사전 빌드된 SwiftFormat app을 설치하게 된다고 합니다.
(프로젝트에서 이미 cocoapods을 사용하고 있다고 가정하고)
1. podfile에 다음 라인을 추가해줍니다.
pod 'SwiftFormat/CLI'
2. terminal을 열고 프로젝트 directory로 이동 후 pod install을 해줍니다.
pod install
3. xcode를 열고 프로젝트 build phase에 SwiftLint script를 추가해준다.
4. 추가된 Run Script를 드래그해서 Compile Sources phase위로 위치를 옮긴다.
순서 상 Compile하기 전에 스크립트를 실행시키려고 하는 것 같아요. 컴파일 전 코드를 자동수정해준다던지 등.. 의 동작을 할 수 있겠네요.
5. 방금 전 위치를 옮긴 Run Script를 열고, 다음 스크립트를 한 줄로 추가해준다.
"${PODS_ROOT}/SwiftFormat/CommandLineTool/swiftformat" "$SRCROOT"
그리고 빌드해보면 Build success가 뜨고 자동 수정된 파일들이 생깁니다.
이제 SwiftFormat이 어떤 기준과 세팅을 가지고 제 코드를 수정했는지 알아볼게요.
SwiftFormat 설정
SwiftFormat은 룰과 옵션 두가지로 나누어집니다. 룰은 SwiftFormat library가 코드를 바꾸는 함수들입니다. 옵션은 룰의 행동을 컨트롤하는 세팅들입니다.
옵션(Options)
command line의 --options argument를 통해서 옵션값을 추가하거나 기본 값을 볼 수 있다고 하네요.
swiftformat --options
Homebrew나 Mint를 통해 설치를 했다면 global command로 swiftformat을 사용해서 옵션값을 확인할 수 있지만, 저는 cocoapods으로 설치했기 때문에 swiftformat 명령어를 사용하려면 swiftformat이 설치된 폴더까지의 directory를 적어줘야 command를 인식할 수 있어요. (swiftformat 을 {Pod폴더까지의 directory}/SwiftFormat/CommandLineTool/swiftformat 으로 교체하면 됩니다.. 좀 귀찮아요)
{Pod폴더까지의 directory}/SwiftFormat/CommandLineTool/swiftformat --options
다른 방법으로 옵션값들을 제어해봅시다! Readme에 따르면 .swiftformat이라는 파일을 만들어서 프로젝트 폴더에 넣으면 .swiftformat 에 선언된 옵션값이 적용된다고 합니다.
룰(Rules)
역시 command line의 --rules argument를 사용해서 룰 목록을 볼 수 있고, --ruleinfo [rule name] 으로 특정 rule의 구체적인 정보를 볼 수 있습니다. 아, 물론 Rules.md 에서도 볼 수 있어요!
swiftformat --rules
indent라는 이름의 rule의 자세한 정보가 궁금하면 다음과 같이 치면 됩니다!
swiftformat --ruleinfo indent
SwiftFormat에서의 Rule은 --disable, --enable argument를 통해 disable 또는 enable 될 수 있습니다. 콤마로 이어 써도 되고, 여러 줄로 나눠 작성해도 됩니다.
swiftformat --rules --disable linebreaks
swiftformat --rules --enable isEmpty
.swiftformat 내부에 룰의 활성화 여부를 추가해서 적용시킬 수도 있습니다.
--disable redundantSelf,trailingClosures
하지만 저는 command line 명령어로 룰을 제어하고싶지는 않고, 파일로 관리를 하고 싶네요.
그래서 Config file을 만들었습니다!
Config file
vi 또는 xcode -> new file을 통해 .swiftformat 파일을 만들어 줍니다.
vi .swiftformat
먼저 제가 수정하고싶은 것은 Trailing Commas 룰입니다. Default configuration을 적용한 SwiftFormat이 Array의 마지막 element 뒤에 저절로 comma를 붙였어요. 저는 마지막 Element 뒤에 comma를 붙이고싶지 않아요. 그럼 .swiftformat 파일을 수정해봅시다!
아까 위에서 .swiftformat을 통해 룰의 옵션값을 컨트롤할 수 있다고 했죠?
.swiftformat에 --commas inline을 추가해줍니다. 다시 빌드를 하니 마지막 comma는 사라졌습니다!
--commas inline
Pods 폴더는 SwiftFormat을 적용시키지 않고 싶어서 다음 라인도 추가해줍니다.
--exclude Pods
전 사실 SwiftFormat 기본 설정값에서 바꿀게 그리 많아보이지는 않았습니다. 저의 최종 .swiftformat 파일은 다음과 같습니다.
--swiftversion 5.0
# format options
--indent 4
--self init-only
--commas inline
--trimwhitespace nonblank-lines
--hexliteralcase lowercase
# file options
--exclude Pods, TimeCamera/AppDelegate.swift, TimeCamera/SceneDelegate.swift
# rules
파일의 자동 수정을 원하지 않는다면?
SwiftFormat은 기본적으로 파일을 주어진 룰에 맞게 수정시킵니다. 혹시 수정을 원하지 않고, lint만 원한다면 다음과 같은 --lint argument 를 사용해서 파일 수정 없이 lint만 볼 수 있습니다!
$ swiftformat --lint path/to/project
SwiftLint와 SwiftFormat을 비교하자면?
'iOS' 카테고리의 다른 글
SwiftLint와 SwiftFormat의 차이? 같이 써도 될까? (0) | 2020.06.07 |
---|---|
SwiftLint를 적용해보았습니다. (0) | 2020.06.06 |
[Swift] String은 mutable인가 immutable인가? (0) | 2020.03.10 |