Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
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
반응형
Archives
Today
Total
관리 메뉴

슈프림 블로그

[iOS/Swift] XCode 프로젝트에 SwiftLint 적용하기 본문

iOS_Swift

[iOS/Swift] XCode 프로젝트에 SwiftLint 적용하기

_슈프림 2021. 2. 14. 22:00
728x90

SwiftLint

XCode 프로젝트에 Swift 코드 컨벤션을 잡아주는 SwiftLint를 적용하는 법을 알아보자.

 

일반적으로 Lint는 다른 언어에서도 소스코드를 분석하여 코드 스타일이나 프로그램 오류가 발생할 수 있는 부분을 찾아주는 도구로 활용된다. SwiftLint는 Swift 언어의 스타일 규칙에 맞지 않는 코드를 찾아내어 경고 또는 에러를 표시해주는 도구다.  SwiftLint를 사용하면 프로그래머는 코드 스타일과 형식(규칙)에 집중하기보다는 더 좋은 성능과 효율에 집중하여 코드를 구현할 수 있게 된다.

 

SwiftLint Repository

github.com/realm/SwiftLint

 

realm/SwiftLint

A tool to enforce Swift style and conventions. Contribute to realm/SwiftLint development by creating an account on GitHub.

github.com

 


사용 방법

  1. SwiftLint 설치
  2. Script 작성
  3. .swiftlint.yml 파일 생성
  4. Warning, Error 수정

 

1. SwiftLint 설치

문서에 나와있듯이, 먼저 Mac에 SwiftLint를 설치한다. Homebrew, Mint 등을 사용하여 설치할 수 있다.

 

2. Script 작성

TargetBuild Phases+ 버튼 → New Run Script Phase

 

새로 생성된 Run Script에 다음 코드를 넣어준다.

if which swiftlint >/dev/null; then
  swiftlint
else
  echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi

 

Run Script의 이름을 SwiftLint Script 로 변경하고, 위치를 Complie Sources 위로 올려준다. 이렇게 하는 이유는, 컴파일 하기 전에 스크립트를 실행시켜 SwiftLint 룰 검사를 먼저 하는 것이 효율적이기 때문이다.

 

빌드를 해보면 수많은 Warning이 발생한 것을 확인할 수 있다. Default Rules를 모두 적용시킨 상태이기 때문이다!!

Default Rules는 이곳에서 Enabled by default 항목을 확인해보면 된다 :-)

 

 

3. .swiftlint.yml 파일 생성

위에서 발생한 Warning들은 기본적으로 생성된 파일이나 내가 손댈 수 없는 Podfile에도 적용된 상태이다. 제외시킬 파일이나 규칙은 제외하고, 팀 또는 프로젝트에서 정한 규칙대로만 검사하도록 하기 위해서는 별도의 Rule을 작성한 파일이 있어야 한다.

 

프로젝트에서 새로운 Empty 파일을 생성해준다. (프로젝트 폴더 아님 주의‼️)

 

이름은 무조건 .swiftlint.yml 로 만들어야 한다. 파일명이 .으로 시작하므로 숨김파일로 처리된다.

 

disabled_rules: 

Default Rules 중에 비활성화하고 싶은 규칙을 추가한다. 규칙 이름은 SwiftLintFramework Reference 에서 확인할 수 있다.

disabled_rules: # Default Rules에서 비활성화할 규칙
    
    # 라인 뒤에 공백이 없어야 합니다. https://realm.github.io/SwiftLint/trailing_whitespace.html
    - trailing_whitespace
    
    # 강제 캐스팅은 피해야합니다. https://realm.github.io/SwiftLint/force_cast.html
    - force_cast
    
    # 강제 언래핑은 피해야합니다. https://realm.github.io/SwiftLint/force_unwrapping.html
    - force_unwrapping

 

opt_in_rules:

기본적으로는 비활성화 되어있지만 활성화하고 싶은 규칙을 추가한다.  SwiftLintFramework Reference 

opt_in_rules:
  # .count==0 보다는 .isEmpty를 사용하는 것이 좋습니다. https://realm.github.io/SwiftLint/empty_count.html
  - empty_count
  
  # 빈 String 문자열과 비교하는 것 보다는 .isEmpty를 사용하는 것이 좋습니다. https://realm.github.io/SwiftLint/empty_string.html
  - empty_string

 

included: 

SwiftLint 검사에서 포함할 파일 경로를 넣어준다.

 

excluded:

SwiftLint 검사에서 제외할 파일 경로들을 넣어준다. 나는 기본적으로 AppDelegate.swift, SceneDelegate.swift, Pods는 제외시켜주는 편이다. included에 포함된 것 보다 우선적으로 처리된다.

excluded: # SwiftLint 검사에서 제외할 파일 경로
  - Pods
  - ProjectName/AppDelegate.swift
  - ProjectName/SceneDelegate.swift

 

일부 규칙은 옵션을 지정할 수 있다.

#- 바이너리 규칙 -#

### warning으로 처리할 지 error로 처리할 지 그 레벨을 설정할 수 있습니다.
force_cast: warning # implicitly
force_try:
  severity: warning # explicitly



#- warning, error 모두 있는 규칙 -#

### 한 줄로는 warning의 수준만 설정할 수 있습니다.
line_length: 110	# implicitly

### 배열을 사용해 warning과 error의 수준을 모두 설정할 수 있습니다.
type_body_length:
  - 300 # warning, implicitly
  - 400 # error, implicitly

file_length:
  warning: 500	# explicitly
  error: 1200	# explicitly
  
  
  
#- 네이밍 규칙 -#

### min_length 및 max_length에 대한 warning/error를 설정할 수 있습니다.
### 규칙에 제외되는 특수한 이름도 지정할 수 있습니다.
type_name:
  min_length: 4 # only warning
  max_length: # warning and error
    warning: 40
    error: 50
  excluded: iPhone # excluded via string
  allowed_symbols: ["_"] # these are allowed in type names

identifier_name:
  min_length: # only min_length
    error: 4 # only error
  excluded: # excluded via string array
    - id
    - URL
    - GlobalAPIKey
    
reporter: "xcode" # reporter type (xcode, json, csv, checkstyle, codeclimate, junit, html, emoji, sonarqube, markdown, github-actions-logging)

 

 

 

 

4. Warning, Error 수정

Lint 룰을 적용하고 빌드하면 경고와 오류들이 발생한다. 항상 commit을 올리기 전, Lint 오류들을 모두 해결하는 것이 바람직하다!

 

반응형
Comments