개인프로젝트 - 5 (SwiftLint)

2023. 4. 17. 23:32iOS/프로젝트

SwiftLint 적용하기

프로젝트에 SwiftLint를 적용합니다. 팀 프로젝트에서는 사용해 보았지만 실제로 제가 적용해 본 적은 없어서 한 번 해보려고 합니다.

 

목표 달성

공식 깃헙을 참고해 보겠습니다.

https://github.com/realm/SwiftLint

 

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 란

Swift 스타일과 컨벤션을 강화하기 위한 도구입니다.  GitHub Swift Style Guide 의 규칙들을 느슨하게 따릅니다. Swift 커뮤니티에서 주로 받아들여지는 규칙들을 따르도록 하고 있습니다. 가장 인기있는 스타일 가이드 중 하나는 Ray Wenderlich's Swift Style Guide가 있습니다.

한마디로 왜 쓰냐? 묻는다면 저는 ‘개인프로젝트라고 내 맘대로 내 멋대로 코드 지저분하게 쓰게 될까봐’ 쓰게 되었습니다.

 

설치하기

SPM으로 하고 싶었는데 공식문서에 나와 있지 않았고, homebrew로 다운받는 법이 먼저 나와있어서 정석대로 해보려고 합니다.

brew install swiftlint

그런데 팀 프로젝트를 하며 이미 설치를 했었다는 사실이 기억나서 스킵하겠습니다.

 

Run Script 추가하기

앱 타겟에서 Build Phases → New Run Script Phase 수행

 

 

아래 코드를 추가합니다.

 

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

 

저처럼 homebrew로 설치한 경우에 M1 맥북이라면 export PATH="$PATH:/opt/homebrew/bin" 코드를 추가하지 않으면 아래와 같은 경고가 뜨기 때문에 꼭 해당 코드를 넣어주어야 합니다.

 

warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint

 

 

애플 실리콘 맥에서는 homebrew로 설치하면 특정 경로 -  /opt/homebrew/bin - 에 저장이 되기 때문에 Xcode에 알려주는 것입니다.

 

주의: SwiftLint는 컴파일러의 파싱 단계를 완료한 클린한 코드에 대해 유효하게 동작되도록 디자인되었다고 합니다. 따라서 컴파일 전에 실행하는 것 (Compile Sources 전에 위치시키는 것) 은 부정확한 결과를 도출해 낼 수도 있다고 합니다.

 

린트 Rules 적용하기

우선 .swiftlint.yml 파일을 추가해서 린트 규칙을 정의해야 합니다.

https://green1229.tistory.com/249

 

SwiftLint

안녕하세요. 그린입니다🟢 이번 포스팅에서는 SwiftLint에 대해 뿌셔보겠습니다! 코드 컨벤션을 체크해주는 툴이 필요한 이유 우선 다들 동료 개발자와 협업을 하면서 코드 컨벤션을 맞춰가는 과

green1229.tistory.com

 

위의 친절한 블로그 글을 참고해서 나름대로 설정했습니다.

저는 남은 할 일들을 TODO로 정리해놨기 때문에 계속해서 노란 경고를 보고 자극이 될 수 있도록.. TODO 워닝을 켜 놨습니다.ㅎㅎ

 

오류 해결하기

Xcode 14 버전 이후부터 일어나는 경고인 것 같은데, 아래와 같은 경고 문구가 뜰 겁니다.

Run script build phase 'Run Script' will be run during every build because it does not specify any outputs. To address this warning, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase.

 

Run Script가 모든 빌드마다 수행된다. 이유는 output을 특정하지 않고 있기 때문에. script phaseoutput dependency들을 추가하거나 script phase에서 "Based on dependency analysis" 체크를 해제함으로써 모든 빌드마다 수행되도록 할 수 있다.

… 고 합니다.

 

관련해서는 아래의 깃헙 이슈 글들이 꽤나 활발했습니다.

https://github.com/realm/SwiftLint/issues/4015

 

Xcode 14 introduces new run script build phase warning for SwiftLint · Issue #4015 · realm/SwiftLint

New Issue Checklist Updated SwiftLint to the latest version I searched for existing GitHub issues Describe the bug Possibly somewhat of a duple of #2783, but Xcode 14 appears to emit a new warning ...

github.com

 

우선은 기본적으로 선택된 Based on dependency analysis 체크박스를 해제하면 워닝은 사라집니다.

 

 

그런데 그런 경우에는 위에서 번역한 내용대로 Run Script가 모든 빌드마다 수행되기 때문에 계속해서 린트가 중복 실행되어 퍼포먼스 문제가 발생할 수도 있습니다.

 

쭉 글을 읽던 중 한 능력자 분의 코멘트를 발견했고, 친절히 예제 레포지터리까지 만들어 위의 경고도 없애고 성능 문제도 해결하는 방법을 설명해 주시는 것이었습니다..

 

https://github.com/steven851007/SwiftLint_build_phase_example

 

GitHub - steven851007/SwiftLint_build_phase_example

Contribute to steven851007/SwiftLint_build_phase_example development by creating an account on GitHub.

github.com

 

간단하게는 input-output 파일 사용함으로써 변경된 파일만 린트 적용해서 빌드 시간을 단축할 수 있다는 것이 글의 요지였습니다.

그래서 열심히 따라서 프로젝트 셋업을 했고 중간에 아래와 같은 오류가 나왔지만 또 그 아래의 링크로 해결했습니다.

 

 

https://es1015.tistory.com/447

 

[Xcode] Build error Permission denied 해결 방법

Xcode Build Error Permission denied 해결 방법 Xcode Build 중 Permission denied 에러 발생 Unity Project를 iOS용으로 export 한 후 Xcode에서 Build 시 오류가 발생하였습니다. 발생 에러 /Users/Library/Developer/Xcode/DerivedData/U

es1015.tistory.com

 

그리고 워닝이 사라졌습니다!

 

Xcode Scheme pre-build를 사용해 특정 파일을 실행하고, 그 파일을 실행하면서 변경사항이 있는 파일만 린트를 적용할 수 있게 해 주고 SwiftLint의 인풋/아웃풋 파일을 생성해 주면서 워닝을 없애주는구나 까지는 이해를 했는데..

자세한 내용은 아직 깊게 이해를 못해서 또 TODO를 추가해야 겠습니다.

 

남아있는 질문들

  • SwiftLint_build_phase_example 완벽히 이해하기!!

 

대답한 질문들

없습니다.. 정말 조만간 날 잡아서 해결할 것입니다.