iOS/Swift

[iOS] SwiftLint 사용

유훈 | Yuhun 2022. 10. 23. 00:42
반응형

코드 컨벤션을 지키기 위해 추가로 SwiftLint를 사용해보려 합니다.

먼저 SwiftLint github입니다.

 

GitHub - realm/SwiftLint: A tool to enforce Swift style and conventions.

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

github.com

한국어 버전의 README도 있습니다.

 

GitHub - realm/SwiftLint: A tool to enforce Swift style and conventions.

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

github.com

SwiftLint를 사용하기 위해선 다음의 순서가 필요합니다.

1. SwiftLint 설치

2. 프로젝트의 Script에 추가

3. .swiftlint.yml 파일 추가 및 커스텀

 

+ SwiftLint 규칙

설치

문서를 보면 Brew, Pod, Mint를 사용할 수 있는데 저는 Brew를 사용했습니다.

터미널에서 다음 명령어로 설치해줍니다.

brew install swiftlint

프로젝트에 추가

프로젝트 파일에 들어가 Build Phases에 들어갑니다.

+ 버튼을 눌러 New Run Script Phase를 클릭해 Run Script를 만듭니다.

이후 코드 창에 다음을 복사 및 붙여넣기합니다.

(Pod으로 설치했다면 첫번째 줄은 쓰지 않으셔도 됩니다. Brew로 설치시엔 경로를 알려줘야 인식하기에 추가해 주어야합니다.)

export PATH="$PATH:/opt/homebrew/bin"
if which swiftlint > /dev/null; then
  swiftlint
else
  echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi

이름을 Swift Lint Script로 바꾸고 Complile 위로 올려주었습니다.

규칙 설정

기본 규칙이 있지만 원하는 규칙을 설정할 수 있고 원하는 파일에만 지정할 수도 있습니다.

그래서 .swiftlint.yml 파일을 만들고 지정해 주어야 합니다.

 

프로젝트 경로에 파일을 추가해줍니다.

 

기본적으로 AppDelegate와 SceneDelegate에 에러가 많이 뜸으로 다음을 .yml 파일에 작성해 Lint에서 제외해 주었습니다.

excluded:
  - <프로젝트 이름>/AppDelegate.swift
  - <프로젝트 이름>/SceneDelegate.swift

 

기본적인 설치 과정은 끝났고 커스텀해서 사용하시면 됩니다. 이제 Build시에 Lint에 어긋난 부분에 경고메세지가 뜨게됩니다.

 

SwiftLint 규칙

  • disabled_rules: 기본규칙에서 비활성화합니다.
  • opt_in_rules:  기본규칙에 없는 규칙 활성화합니다.
  • only_rules: 목록에 지정된 규칙만 활성화. disabled_rules또는 opt_in_rules와 함께 지정할 수 없습니다.
  • analyzer_rules:  analyze 명령으로만 실행되는 별개의 규칙입니다.
  • included:  규칙에 포함할 경로
  • excluded:  규칙에서 제외할 경로 (위에서 예제로 사용)

다음은 한국어버전 SwiftLint README에서 가져온 룰 설정 예시입니다.

disabled_rules: # 실행에서 제외할 룰 식별자들
  - colon
  - comma
  - control_statement
opt_in_rules: # 일부 룰은 옵트 인 형태로 제공
  - empty_count
  - missing_docs
  # 사용 가능한 모든 룰은 swiftlint rules 명령으로 확인 가능
included: # 린트 과정에 포함할 파일 경로. 이 항목이 존재하면 `--path`는 무시됨
  - Source
excluded: # 린트 과정에서 무시할 파일 경로. `included`보다 우선순위 높음
  - Carthage
  - Pods
  - Source/ExcludedFolder
  - Source/ExcludedFile.swift

# 설정 가능한 룰은 이 설정 파일에서 커스터마이징 가능
# 경고나 에러 중 하나를 발생시키는 룰은 위반 수준을 설정 가능
force_cast: warning # 암시적으로 지정
force_try:
  severity: warning # 명시적으로 지정
# 경고 및 에러 둘 다 존재하는 룰의 경우 값을 하나만 지정하면 암시적으로 경고 수준에 설정됨
line_length: 110
# 값을 나열해서 암시적으로 양쪽 다 지정할 수 있음
type_body_length:
  - 300 # 경고
  - 400 # 에러
# 둘 다 명시적으로 지정할 수도 있음
file_length:
  warning: 500
  error: 1200
# 네이밍 룰은 경고/에러에 min_length와 max_length를 각각 설정 가능
# 제외할 이름을 설정할 수 있음
type_name:
  min_length: 4 # 경고에만 적용됨
  max_length: # 경고와 에러 둘 다 적용
    warning: 40
    error: 50
  excluded: iPhone # 제외할 문자열 값 사용
identifier_name:
  min_length: # min_length에서
    error: 4 # 에러만 적용
  excluded: # 제외할 문자열 목록 사용
    - id
    - URL
    - GlobalAPIKey
reporter: "xcode" # 보고 유형 (xcode, json, csv, codeclimate, checkstyle, junit, html, emoji, sonarqube, markdown, github-actions-logging)

 

다음은 룰 종류가 있는 링크인데 종류가 정말 많네요... 적당한 규칙을 골라 커스텀하는 게 중요할 것 같습니다.

 

Rule Directory Reference

 

realm.github.io

 

반응형