티스토리 뷰

iOS

SwiftLint를 적용해보았습니다.

달리Dali 2020. 6. 6. 18:58

미뤄왔던 Swift의 linter, formatter library를 적용해보려고 합니다. 

가장 흔하게 사용되는 SwiftLint와 흔하지 않지만 주변에서 간간히 사용하는 SwiftFormat 중에서 고민을 했는데, 결국 둘 다 써봐야 장단점이 어떤지를 알 수 있을 것 같아서, 둘 다 사용해보려고 했습니다.

 

 먼저 고른것은 SwiftLint!  시작! 

 

SwiftLint 시작하기

https://github.com/realm/SwiftLint

SwiftLint의 가장 좋은점은 한글Readme가 있다는 점!(예이~) 

Readme를 보면 여러가지 설치방법을 잘 설명해주고 있어요. Homebrew를 통해 설치하면 globally 여러 프로젝트에서 사용이 가능하지만 최신 버전만 설치 가능하고, cocoapods으로 설치하면 해당 프로젝트에서만 사용 가능하지만 버전 선택이 가능합니다. 저는 test용이기 때문에 cocoapods을 통해 설치를 했고요.

 

 

Cocoapod을 통한 설치

(프로젝트에서 이미 cocoapods을 사용하고 있다고 가정하고)

1. podfile에 다음 라인을 추가해줍니다.

pod 'SwiftLint'

 

2. terminal을 열고 프로젝트 directory로 이동 후 pod install을 해줍니다.

pod install

 

3. xcode를 열고 프로젝트 build phase에 SwiftLint script를 추가해준다.

 새로 추가된 Run Script block에 SwiftLint 실행파일을 실행시켜주는 script를 추가한다.

${PODS_ROOT}/SwiftLint/swiftlint

 그럼 매 빌드마다 스크립트가 실행되면서 lint를 실행하게 됩니다.

 

 

4. 이제 SwiftLint의 룰을 추가해줘야 하는데.. 룰의 설정파일은 처음엔 직접 만들어줘야 합니다. 물론 만들지 않아도 됩니다. 그러면 SwiftLint의 default rule이 적용됩니다. 하지만 원하는 룰이 있고, 지키고싶지 않은 룰 또는 옵션을 바꾸고싶은 룰 등이 있으니 우린 설정파일을 만들어서 custom하게 조절해 사용할 수 있습니다!

 

 파일명을 .swiftlint.yml로 하는 파일을 프로젝트 폴더에 만들어줍니다. 터미널 vi 명령어로 만들어도 되고, xcode new file을 통해 만들어도 되고~ 

vi .swiftlint.yml

그리고 그 파일 내에 어떤 룰을 활성화시킬지, 비활성화시킬지 적어서 적용시킬 수 있어요! 기본적으로 활성화되어있는 룰들이 있는데, 

 룰은 SwiftLinkRules 여기를 참조하시면 됩니다. 설정파일의 예제는 SwifLinkSetting 이부분을 보면 됩니다. 

  

 제 개인프로젝트에 SwiftLint를 추가하고 빌드를 돌려보니, MainViewController의 길이가 200줄이 넘는다는 warning, enum의 각 case가 소문자로 시작하지 않는다는 error, 상수에 언더바가 들어있다는 에러 등.. 많은 워닝과 에러의 향연이 시작되었습니다 ^.^

 

SwitLint: 200줄이 넘으면 안됩니다!

 enum의 case는 소문자로 시작하게끔 바꿔줍니다. 이건 google swift style guide에서도 사용하는 방식이라 소문자로 맞춰주었습니다.

SwiftLint: 소문자로 시작해야 합니다!

 

 그리고 변수명에 언더바가 들어가 있지 않은 것.. 이 옵션은 수정해볼게요. 드물지만 상황에 따라 언더바를 사용하고싶을 때가 있어서요. 

SwiftLint: 알파벳만 가능합니다!

 

 Rule 설정값 수정하기

 에러메세지를 보니 Identifier Name Violation이라고 나와있어서 찾아보니 Identifier Name이라는 Rule이 있네요.

 그런데 저는 Identifier Name Rule중에서 소문자로 시작하게 강제하는 rule은 남기고 싶고, 언더바만 사용 가능하게 바꾸고 싶습니다!

 이럴 때 Identifier Name의 default configuration을 수정해주면 됩니다. 

 

 Default configuration을 보면 최소 길이는 warning은 3, error는 2일때 난다고 되어있는 등 기본 설정값을 볼 수 있습니다.

 전 allowed_symbols에 "_"만 추가하면 될 것 같아요.

Default configuration: (min_length) w/e: 3/2, (max_length) w/e: 40/60, excluded: [], 
			allowed_symbols: [], validates_start_with_lowercase: true

 

yml파일을 다음과 같이 수정하고 빌드를 돌려봅니다.

identifier_name:
    allowed_symbols: ["_"]

 짠! error's gone!

.swiftlint.yml에 옵션을 넣지 않고 빌드했을 때
.swiftlint.yml에 언더바 심볼은 허용하는 옵션을 추가한 후 빌드했을 때

 

 최소 길이, 제외할 문자 등, 다른 옵션들은 아래 코드처럼 수정이 가능합니다. *참고~

identifier_name:
    min_length: # min_length에서
    	error: 4 # 에러만 적용
    max_length:	# max_length에서
    	warning: 40 #40글자 넘으면 
    	error: 50   #50글자 넘으면 에러
    excluded: # 제외할 문자열 목록 사용
    	- id
    	- URL
    	- GlobalAPIKey

 

 Rule 비활성화 하기

 colon같은 기 활성화되어있는 특정 rule을 비활성화 하고싶으면 yml파일에 다음과 같이 코드를 추가해 줍니다. 

disabled_rules: # 실행에서 제외할 룰 식별자들
    - colon

 

 Lint적용하지 않을 폴더/파일은?

 Pods폴더에 있는 파일들은 lint를 적용하고싶지 않기 때문에 다음과 같은 코드를 추가해주었습니다~

excluded: # 린트 과정에서 무시할 파일 경로. `included`보다 우선순위 높음
    - Pods

 

 

 나의 final .swiftlint.yml 파일은?

 제 프로젝트에 맞게 최종 수정된 .swiftlint.yml파일은 다음처럼 생겼습니다.

 개발 하면서 좀더 추가되고 빠지겠죠? SwiftLint를 적용했더니 확실히 신경쓰지 못했던 컨벤션이나 네이밍 등을 챙길 수 있는 점이 좋은 것 같습니다.

identifier_name:    # From https://realm.github.io/SwiftLint/identifier_name.html
    excluded:
        - id
    allowed_symbols: ["_"]
    
force_cast:         # From https://realm.github.io/SwiftLint/force_cast.html
    warning         # 강제 캐스팅은 error에서 warning으로 변경

function_body_length:   # From https://realm.github.io/SwiftLint/function_body_length.html
    error:  200

trailing_whitespace:
    ignores_empty_lines: true

line_length:        # From https://realm.github.io/SwiftLint/line_length.html
    error:   240    

excluded: # 린트 과정에서 무시할 파일 경로. `included`보다 우선순위 높음
    - Pods
    - TimeCamera/Extension/UIView+.swift
    - TimeCamera/Extension/UIColor+.swift
    - TimeCamera/Extension/UIImage+.swift

 


SwiftFormat이 궁금하다면?

 

SwiftFormat을 적용해봅니다.

 저번에 SwiftLint를 써보았으니, 오늘은 SwiftFormat을 써보려고 합니다!  (* SwiftLint가 궁금하시다면 이쪽으로!) SwiftLint를 드디어 적용해봅니다. 미뤄왔던 Swift의 lint library를 적용해보려고 합니다...

summerhorang.tistory.com

 

SwiftLint와 SwiftFormat을 비교하자면

 

SwiftLint와 SwiftFormat의 차이? 같이 써도 될까?

 SwiftLint와 SwiftFormat을 둘 다 적용해보았습니다.  먼저 이 둘을 비교하는게 맞는지는 모르겠습니다. 겹치는 기능이 있지만, 애초에 주된 기능이 서로 다르기 때문입니다.  SwiftLint  SwiftLint는 정�

summerhorang.tistory.com

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/09   »
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
글 보관함