SwiftLint๋ ์ค์ํํธ ์คํ์ผ ๋ฐ ์ปจ๋ฒค์ ์ ๊ฐ์ ํ๊ธฐ ์ํ ๋๊ตฌ๋ก, Kodeco ์ค์ํํธ ์คํ์ผ ๊ฐ์ด๋์ ๋๋ต์ ์ธ ๊ธฐ๋ฐ์ ๋๊ณ ์์ต๋๋ค.
SwiftLint๋ ์ข ๋ ์ ํํ ๊ฒฐ๊ณผ๋ฅผ ์ํด Clang๊ณผ SourceKit์ ์ฐ๊ฒฐํ์ฌ ์์ค ํ์ผ์ AST ํํ์ ์ฌ์ฉํฉ๋๋ค.
๋ณธ ํ๋ก์ ํธ๋ Contributor Covenant Code of Conduct๋ฅผ ์ถฉ์คํ ๋ฐ๋ฆ ๋๋ค. ๋ณธ ํ๋ก์ ํธ์ ์ฐธ์ฌํจ์ผ๋ก์จ ์ด๋ฌํ ์์น์ ์ค์ํด์ผ ํฉ๋๋ค. ๋ฐ์๋ค์ผ ์ ์๋ ํญ๋ชฉ์ด ์๋ค๋ฉด [email protected]๋ก ์๋ ค์ฃผ์ธ์.
Homebrew๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
brew install swiftlint
CocoaPods๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
Podfile์ ์๋ ๋ผ์ธ์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
pod 'SwiftLint'
์ด๋ฅผ ์คํํ๋ฉด ๋ค์๋ฒ pod install
์คํ ์ SwiftLint ๋ฐ์ด๋๋ฆฌ ๋ฐ Pods/
์ ์๋ ๋ํ๋์๋ค์ ๋ค์ด๋ก๋ํ๊ณ , Script Build Phases์์ ${PODS_ROOT}/SwiftLint/swiftlint
๋ช
๋ น์ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
CocoaPods๋ฅผ ์ฌ์ฉํ๋ฉด ์ต์ ๋ฒ์ ์ธ์๋ SwiftLint์ ํน์ ๋ฒ์ ์ ์ค์นํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด ๋ฐฉ๋ฒ์ ๊ถ์ฅํฉ๋๋ค. (Homebrew๋ ์ต์ ๋ฒ์ ๋ง ์ค์น ๊ฐ๋ฅ)
์ด๋ ๊ฒ ํ์ ๋ SwiftLint ๋ฐ์ด๋๋ฆฌ ๋ฐ ๊ทธ์ ์ข
์๋ ๋ฐ์ด๋๋ฆฌ๋ค๊ณผ ์ค์ํํธ ๋ฐ์ด๋๋ฆฌ๊น์ง Pods/
๋๋ ํฐ๋ฆฌ์ ์ถ๊ฐ๋๊ธฐ ๋๋ฌธ์, git ๋ฑ์ SCM์ ์ด๋ฐ ๋๋ ํฐ๋ฆฌ๋ค์ ์ฒดํฌ์ธํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์์ต๋๋ค.
Mint๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
$ mint install realm/SwiftLint
์ต์ ๊นํ๋ธ ๋ฆด๋ฆฌ์ฆ์์ SwiftLint.pkg
๋ฅผ ๋ค์ด๋ก๋ํด์ ์ค์นํ๊ณ ์คํํ ์ ์์ต๋๋ค.
๋ณธ ํ๋ก์ ํธ๋ฅผ ํด๋ก ํด์ ๋น๋ํ ์๋ ์์ต๋๋ค. make install
๋ช
๋ น์ ์ฌ์ฉํฉ๋๋ค. (Xcode 12.5 ์ดํ ๋ฒ์ )
ํ๋ก์ ํธ์ SwiftLint๋ฅผ ํตํฉํ๊ธฐ ์ํ ๊ถ์ฅ ์ฌ์ฉ ๋ฐฉ์์ ์ ๋ฐ์ ์ธ ๊ฐ์๋ฅผ ์๊ณ ์ถ๋ค๋ฉด, ์๋ ํ๋ ์ ํ ์ด์ ์์์ ๋ณด๊ฑฐ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ด๋ณด๋ฉด ์ข์ต๋๋ค.
SwiftLint๋ฅผ Xcode ํ๋ก์ ํธ์ ํตํฉํ์ฌ IDE ์์ ๊ฒฝ๊ณ ๋ ์๋ฌ๋ฅผ ํ์ํ ์ ์์ต๋๋ค. ํ๋ก์ ํธ์ ํ์ผ ๋ด๋น๊ฒ์ดํฐ์์ ํ๊ฒ ์ฑ์ ์ ํ ํ "Build Phases" ํญ์ผ๋ก ์ด๋ํฉ๋๋ค. + ๋ฒํผ์ ํด๋ฆญํ ํ "Run Script Phase"๋ฅผ ์ ํํฉ๋๋ค. ๊ทธ ํ ์๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
if which swiftlint >/dev/null; then
swiftlint
else
echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi
๋ง์ฝ, ์ ํ ์ค๋ฆฌ์ฝ ํ๊ฒฝ์์ Homebrew๋ฅผ ํตํด SwiftLint๋ฅผ ์ค์นํ๋ค๋ฉด, ์๋ง๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ๊ณ ๋ฅผ ๊ฒช์์ ๊ฒ์ ๋๋ค.
warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint
๊ทธ ์ด์ ๋, ์ ํ ์ค๋ฆฌ์ฝ ๊ธฐ๋ฐ ๋งฅ์์ Homebrew๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ด๋๋ฆฌ๋ค์ /opt/homebrew/bin
์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์
๋๋ค. SwiftLint๊ฐ ์ด๋ ์๋์ง ์ฐพ๋ ๊ฒ์ Xcode์ ์๋ ค์ฃผ๊ธฐ ์ํด, build phase์์ /opt/homebrew/bin
๋ฅผ PATH
ํ๊ฒฝ ๋ณ์์ ๋์์ ์ถ๊ฐํ์ฌ์ผ ํฉ๋๋ค.
if [[ "$(uname -m)" == arm64 ]]; then
export PATH="/opt/homebrew/bin:$PATH"
fi
if which swiftlint > /dev/null; then
swiftlint
else
echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi
ํน์ ์๋์ ๊ฐ์ด /usr/local/bin
์ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์์ฑํ์ฌ ์ค์ ๋ฐ์ด๋๋ฆฌ๊ฐ ์๋ ๊ณณ์ผ๋ก ํฌ์ธํ
ํ ์ ์์ต๋๋ค. :
ln -s /opt/homebrew/bin/swiftlint /usr/local/bin/swiftlint
๋น์ ์ SwiftLint phase๋ฅผ 'Compile Sources' ๋จ๊ณ ์ง์ ์ผ๋ก ์ฎ๊ฒจ ์ปดํ์ผ ์ ์ ์๋ฌ๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ๊ณ ์ถ์ด ํ ๊ฒ์ ๋๋ค. ํ์ง๋ง, SwiftLint๋ ์ปดํ์ผ๋ฌ์ ๊ตฌ๋ฌธ ๋ถ์ ๋จ๊ณ๋ฅผ ์๋ฒฝํ ์ํํ๋ ์ ํจํ Swift ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค. ๋ฐ๋ผ์, 'Compile Sources' ์ ์ SwiftLint๋ฅผ ์คํํ๋ฉด ์ผ๋ถ ๋ถ์ ํํ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์๋ ์์ต๋๋ค.
๋ง์ฝ ๋น์ ์ ์๋ฐ ์ฌํญ(violations)์ ๋์์ ์์ ํ๋ ๊ฒ์ ์ํ๋ค๋ฉด, ์คํฌ๋ฆฝํธ์ swiftlint
๋์ swiftlint --fix && swiftlint
์ ์ ์ด์ผ ํฉ๋๋ค. ์ด๋ ํ๋ก์ ํธ์ ์์ ๊ฐ๋ฅํ ๋ชจ๋ ์๋ฐ ์ฌํญ๋ค์ด ์์ ๋๊ณ ๋๋จธ์ง ์๋ฐ ์ฌํญ์ ๋ํ ๊ฒฝ๊ณ ๊ฐ ํ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
CocoaPods๋ฅผ ์ฌ์ฉํด์ ์ค์นํ ๊ฒฝ์ฐ๋ ์๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋์ ์ฌ์ฉํฉ๋๋ค.
"${PODS_ROOT}/SwiftLint/swiftlint"
Xcode์์ ์ ์ฅ์ swiftlint autocorrect
๋ฅผ ์คํํ๋ ค๋ฉด Alcatraz์์ SwiftLintXcode ํ๋ฌ๊ทธ์ธ์ ์ค์นํฉ๋๋ค.
โ ๏ธ์ด ํ๋ฌ๊ทธ์ธ์ Xcode 8์์ SIP๋ฅผ ๋นํ์ฑํํ์ง ์์ผ๋ฉด ๋์ํ์ง ์์ผ๋ฉฐ, ์ด๋ ๊ถ์ฅํ์ง ์์ต๋๋ค.
AppCode์์ SwiftLint๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ด ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๊ณ ํ๋ฌ๊ทธ์ธ ํ๊ฒฝ์ค์ ์์ SwiftLint๊ฐ ์ค์น๋ ๊ฒฝ๋ก๋ฅผ ์ง์ ํด์ค๋๋ค. autocorrect
์ก์
์ โฅโ
๋จ์ถํค๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
Atom์์ SwiftLint๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด APM์์ linter-swiftlint
ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค.
fastlane ๊ณผ์ ์์ SwiftLint๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๊ณต์์ ์ธ fastlane ์ก์ ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
swiftlint(
mode: :lint, # SwiftLint ๋ชจ๋: :lint (๋ํดํธ) ์๋๋ฉด :autocorrect
ย executable: "Pods/SwiftLint/swiftlint", # SwiftLint ๋ฐ์ด๋๋ฆฌ ๊ฒฝ๋ก (์ ํ ๊ฐ๋ฅ). CocoaPods๋ฅผ ์ฌ์ฉํด์ ์ค์นํ ๊ฒฝ์ฐ๋ ์ด ์ต์
์ด ์ค์ํฉ๋๋ค
ย output_file: "swiftlint.result.json", # ๊ฒฐ๊ณผ ํ์ผ์ ๊ฒฝ๋ก (์ ํ ๊ฐ๋ฅ)
ย reporter: "json", # ๋ณด๊ณ ์ ํ (์ ํ ๊ฐ๋ฅ)
ย config_file: ".swiftlint-ci.yml", ย ย # ์ค์ ํ์ผ์ ๊ฒฝ๋ก (์ ํ ๊ฐ๋ฅ)
ignore_exit_status: true # SwiftLint ์ข
๋ฃํ ๋ 0์ด ์๋ ๋ฐํํ ์ข
๋ฃ ์ฝ๋๋ฅผ ๋ฌด์ํด์ fastlane ๊ณ์ ์คํํฉ๋๋ค
)
$ swiftlint help
Available commands:
autocorrect Automatically correct warnings and errors
help Display general or command-specific help
lint Print lint warnings and errors for the Swift files in the current directory (default command)
rules Display the list of rules and their identifiers
version Display the current version of SwiftLint
์ค์ํํธ ํ์ผ์ด ์๋ ๋๋ ํฐ๋ฆฌ์์ swiftlint
๋ฅผ ์คํํฉ๋๋ค. ๋๋ ํฐ๋ฆฌ๋ ์ฌ๊ท์ ์ผ๋ก ํ์๋ฉ๋๋ค.
lint
๋ autocorrect
๋ฅผ ์ฌ์ฉํ ๋ ์ฌ๋ฌ ํ์ผ(์๋ฅผ ๋ค๋ฉด, ExtraBuildPhase
ํ๋ฌ๊ทธ์ธ์ ์ํด Xcode๊ฐ ๋ณ๊ฒฝํ ํ์ผ๋ค ํน์ git ls-files -m
๋ช
๋ น์ผ๋ก ์ธํด ์์
ํธ๋ฆฌ์์ ๋ณ๊ฒฝ๋ ํ์ผ๋ค)์ ์ง์ ํ๋ ค๋ฉด --use-script-input-files
์ต์
์ ๋๊ธฐ๊ณ ๋ค์ ์ธ์คํด์ค ๋ณ์๋ค์ ์ค์ ํ๋ฉด ๋ฉ๋๋ค. SCRIPT_INPUT_FILE_COUNT
and
SCRIPT_INPUT_FILE_0
, SCRIPT_INPUT_FILE_1
...SCRIPT_INPUT_FILE_{SCRIPT_INPUT_FILE_COUNT - 1}
์ด๋ Xcode์ ์ปค์คํ ์คํฌ๋ฆฝํธ ๋จ๊ณ์ ์ ๋ ฅ ํ์ผ๋ก ํ๊ฒฝ ๋ณ์๋ฅผ ์ง์ ํ๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค.
SwiftLint๋ SourceKit์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฏ๋ก ์ค์ํํธ ์ธ์ด๊ฐ ๋ณํํ๋๋ผ๋ ์ด์ ์์ด ๋์ํ ์ ์์ต๋๋ค.
์ด๋ ์ ์ฒด ์ค์ํํธ ์ปดํ์ผ๋ฌ๊ฐ ํฌํจ๋์ง ์์๋ ๋๋ฏ๋ก SwiftLint๊ฐ ๊ฐ๊ฒฐํ๊ฒ ์ ์ง๋ ์ ์์ต๋๋ค. SwiftLint๋ ๋ฐ์คํฌํ์ ์ด๋ฏธ ์ค์น๋์ด ์๋ ๊ณต์ ์ค์ํํธ ์ปดํ์ผ๋ฌ์ ํต์ ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
SwiftLint๋ฅผ ์คํํ ๋๋ ํญ์ ์ค์ํํธ ํ์ผ์ ์ปดํ์ผํ๋ ๋์ผํ ํด์ฒด์ธ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ค์น๋ ํด์ฒด์ธ์ด๋ Xcode๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ ํน์ ์ค์ํํธ ๊ตฌ ๋ฒ์ ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ(Xcode 8์์ ์ค์ํํธ 2.3 ๋ฒ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ)์๋ SwiftLint์ ๊ธฐ๋ณธ ์ค์ํํธ ํด์ฒด์ธ์ ๋ณ๊ฒฝํด์ผ ํ ์๋ ์์ต๋๋ค.
SwiftLint๊ฐ ์ด๋ ์ค์ํํธ ํด์ฒด์ธ์ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํ๋ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
$XCODE_DEFAULT_TOOLCHAIN_OVERRIDE
$TOOLCHAIN_DIR
or$TOOLCHAINS
xcrun -find swift
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain
/Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain
~/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain
~/Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain
sourcekitd.framework
์ ์์์ ์ ํ๋ ๊ฒฝ๋ก์ usr/lib/
ํ์ ๋๋ ํฐ๋ฆฌ์ ์กด์ฌํด์ผ ํฉ๋๋ค.
TOOLCHAINS
ํ๊ฒฝ ๋ณ์์ ์ค์ํํธ ํด์ฒด์ธ ๋ฒ์ ์ ์๋ณํ ์ ์๋ ๊ฐ์ ๋ฆฌ๋ฒ์ค DNS ํ์์ผ๋ก ์ง์ ํ ์๋ ์์ต๋๋ค.
$ TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 swiftlint autocorrect
๋ฆฌ๋
์ค์์๋ SourceKit์ด /usr/lib/libsourcekitdInProc.so
ํน์ LINUX_SOURCEKIT_LIB_PATH
ํ๊ฒฝ๋ณ์๋ก ์ง์ ๋ ๊ฒฝ๋ก์ ์กด์ฌํด์ผ ํฉ๋๋ค.
SwiftLint์๋ 200๊ฐ๊ฐ ๋๋ ๋ฃฐ๋ค์ด ์๊ณ , ์ค์ํํธ ์ปค๋ฎค๋ํฐ(๋ฐ๋ก ์ฌ๋ฌ๋ถ๋ค!)๋ ์ด๋ฅผ ์ง์์ ์ผ๋ก ๋ฐ์ ์์ผ ๊ฐ๊ณ ์์ต๋๋ค. ํ ๋ฆฌํ์คํธ๋ ์ธ์ ๋ ํ์์ ๋๋ค.
ํ์ฌ ๊ตฌํ๋ ๋ฃฐ ์ ์ฒด๋ฅผ ํ์ธํ๋ ค๋ฉด Source/SwiftLintBuiltInRules/Rules๋ฅผ ์ดํด๋ณด์ธ์.
opt_in_rules
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋์ด ์์ต๋๋ค. (์ฆ, ์ค์ ํ์ผ์์ ๋ช
์์ ์ผ๋ก ํด๋น ๋ฃฐ์ ํ์ฑํํด์ผ ํฉ๋๋ค.)
๋ค์์ ๋ฃฐ์ ์ตํธ ์ธ์ผ๋ก ๊ตฌํํ๋ ๊ฒฝ์ฐ์ ๋ํ ๊ธฐ์ค์ ๋๋ค.
- ์๋ชป ํ๋จ๋ ๊ฐ๋ฅ์ฑ์ด ๋ง์ ๋ฃฐ (์:
empty_count
) - ์๋๊ฐ ๋งค์ฐ ๋๋ฆฐ ๋ฃฐ
- ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ ์ฌ๋์ด ํฉ์ํ์ง ์๊ฑฐ๋ ํน์ ํ ์ํฉ์๋ง ์ ์ฉํ ๋ฃฐ (์:
force_unwrapping
,missing_docs
)
์์ค ํ์ผ์์ ์๋ ํ์์ ์ฃผ์์ ์ฌ์ฉํ๋ฉด ๋ฃฐ์ ๋นํ์ฑํํ ์ ์์ต๋๋ค.
// swiftlint:disable <๋ฃฐ1> [<๋ฃฐ2> <๋ฃฐ3>...]
๋นํ์ฑํ๋ ๋ฃฐ์ ํด๋น ํ์ผ์ ๋ง์ง๋ง๊น์ง ์ ์ฉ๋๊ฑฐ๋, ํ์ฑํ ์ฃผ์์ด ๋ํ๋ ๋๊น์ง ์ ์ฉ๋ฉ๋๋ค.
// swiftlint:enable <๋ฃฐ1> [<๋ฃฐ2> <๋ฃฐ3>...]
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// swiftlint:disable colon
let noWarning :String = "" // ๋ณ์๋ช
๋ฐ๋ก ๋ค์ ์ฝ๋ก ์ด ์์นํ์ง ์๋๋ค๊ณ ๊ฒฝ๊ณ ๊ฐ ๋จ์ง ์์ต๋๋ค!
// swiftlint:enable colon
let hasWarning :String = "" // ๋ณ์๋ช
๋ฐ๋ก ๋ค์ ์ฝ๋ก ์ด ์์นํด์ผ ํ๋ค๋ ๊ฒฝ๊ณ ๊ฐ ํ์๋ฉ๋๋ค.
disable
๊ณผ enable
๋ช
๋ น ๋ค์ :previous
, :this
, :next
๋ฅผ ๋ถ์ด๋ฉด ๊ฐ๊ฐ ๋ช
๋ น์ด ์์นํ ์ด์ ๋ผ์ธ, ํ์ฌ ๋ผ์ธ, ๋ค์ ๋ผ์ธ๋ง ๋ฃฐ์ด ์ ์ฉ๋๊ฒ ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// swiftlint:disable:next force_cast
let noWarning = NSNumber() as! Int
let hasWarning = NSNumber() as! Int
let noWarning2 = NSNumber() as! Int // swiftlint:disable:this force_cast
let noWarning3 = NSNumber() as! Int
// swiftlint:disable:previous force_cast
swiftlint rules
๋ฅผ ์คํํ๋ฉด ๋ชจ๋ ๋ฃฐ ๋ชฉ๋ก๊ณผ ๋ฃฐ๋ณ ์๋ณ์๊ฐ ํ์๋ฉ๋๋ค.
SwiftLint๊ฐ ์คํ๋ ๋๋ ํฐ๋ฆฌ์ .swiftlint.yml
ํ์ผ์ ์ถ๊ฐํด์ SwiftLint๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค. ์๋ ํ๋ผ๋ฏธํฐ๋ค์ ์ค์ ๊ฐ๋ฅํฉ๋๋ค.
๋ฃฐ ์ ์ฉ์ฌ๋ถ ์ค์ :
disabled_rules
: ๊ธฐ๋ณธ ํ์ฑํ๋ ๋ฃฐ ์ค์ ๋นํ์ฑํํ ๋ฃฐ๋ค์ ์ง์ ํฉ๋๋ค.opt_in_rules
: ๊ธฐ๋ณธ ๋ฃฐ์ด ์๋ ๋ฃฐ๋ค์ ํ์ฑํํฉ๋๋ค.only_rules
: ์ง์ ํ ๋ฃฐ๋ค๋ง ํ์ฑํ๋๋๋ก ํ์ดํธ๋ฆฌ์คํธ๋ก ์ง์ ํฉ๋๋ค.disabled_rules
๋ฐopt_in_rules
๊ณผ๋ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
disabled_rules: # ์คํ์์ ์ ์ธํ ๋ฃฐ ์๋ณ์๋ค
- colon
- comma
- control_statement
opt_in_rules: # ์ผ๋ถ ๋ฃฐ์ ์ตํธ ์ธ ํํ๋ก ์ ๊ณต
- empty_count
- missing_docs
# ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๋ฃฐ์ swiftlint rules ๋ช
๋ น์ผ๋ก ํ์ธ ๊ฐ๋ฅ
included: # ๋ฆฐํธ ๊ณผ์ ์ ํฌํจํ ํ์ผ ๊ฒฝ๋ก. ์ด ํญ๋ชฉ์ด ์กด์ฌํ๋ฉด `--path`๋ ๋ฌด์๋จ
- Sources
excluded: # ๋ฆฐํธ ๊ณผ์ ์์ ๋ฌด์ํ ํ์ผ ๊ฒฝ๋ก. `included`๋ณด๋ค ์ฐ์ ์์ ๋์
- Carthage
- Pods
- Sources/ExcludedFolder
- Sources/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)
์๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ ์ค์ ํ์ผ์ ์๋ก์ด ์ ๊ท ํํ์ ๊ธฐ๋ฐ์ ๋ฃฐ์ ์ ์ํ ์ ์์ต๋๋ค.
custom_rules:
pirates_beat_ninjas: # ๋ฃฐ ์๋ณ์
included: ".*.swift" # ๋ฆฐํธ ์คํ ์ ํฌํจํ ๊ฒฝ๋ก๋ฅผ ์ ์ํ๋ ์ ๊ทํํ์. ์ ํ ๊ฐ๋ฅ.
name: "Pirates Beat Ninjas" # ๋ฃฐ ์ด๋ฆ. ์ ํ ๊ฐ๋ฅ.
regex: "([nN]inja)" # ํจํด ๋งค์นญ
match_kinds: # ๋งค์นญํ SyntaxKinds. ์ ํ ๊ฐ๋ฅ.
- comment
- identifier
message: "Pirates are better than ninjas." # ์๋ฐ ๋ฉ์์ง. ์ ํ ๊ฐ๋ฅ.
severity: error # ์๋ฐ ์์ค. ์ ํ ๊ฐ๋ฅ.
no_hiding_in_strings:
regex: "([nN]inja)"
match_kinds: string
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ๋ ์ด์์ match_kinds
๋ฅผ ์ฌ์ฉํด์ ๋งค์นญ๋ ๊ฒฐ๊ณผ๋ฅผ ํํฐ๋งํ ์ ์์ต๋๋ค. ์ด ๋ชฉ๋ก์ ๋ค์ด์์ง ์์ ๊ตฌ๋ฌธ ์ ํ์ด ํฌํจ๋ ๊ฒฐ๊ณผ๋ ๋งค์นญ์์ ์ ์ธ๋ฉ๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๊ตฌ๋ฌธ ์ ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- argument
- attribute.builtin
- attribute.id
- buildconfig.id
- buildconfig.keyword
- comment
- comment.mark
- comment.url
- doccomment
- doccomment.field
- identifier
- keyword
- number
- objectliteral
- parameter
- placeholder
- string
- string_interpolation_anchor
- typeidentifier
SwiftLint๋ ์ค์ ํ์ผ์ ์ค์ฒฉ๋๊ฒ ๊ตฌ์ฑํด์ ๋ฆฐํธ ๊ณผ์ ์ ๋์ฑ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค.
- ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ์์ ํ์ํ ๊ณณ์ด๋ฉด ์ด๋๋ ์ง
.swiftlint.yml
ํ์ผ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. - ๊ฐ ํ์ผ์ ์์ ์ ๋๋ ํฐ๋ฆฌ ๋ด์ ์๋ ์ค์ ํ์ผ์ ์ฌ์ฉํ๊ฑฐ๋, ๊ณ์ธต๊ตฌ์กฐ ์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ถ๋ชจ ๋๋ ํฐ๋ฆฌ์ ์๋ ์ค์ ํ์ผ์ ์ฌ์ฉํด์ ๋ฆฐํธ๋ฉ๋๋ค. ๋ณ๋๋ก ์ค์ ํ์ผ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ๋ฃจํธ์ ์๋ ์ค์ ํ์ผ์ด ์ฌ์ฉ๋ฉ๋๋ค.
- ์ค์ฒฉ ๊ตฌ์ฑ์์
excluded
๋ฐincluded
๋ ๋ฌด์๋ฉ๋๋ค.
SwiftLint๋ ์ผ๋ถ ์๋ฐ ์ฌํญ๋ค์ ์๋์ผ๋ก ์์ ํ ์ ์์ต๋๋ค. ๋์คํฌ ์์ ํ์ผ๋ค์ ์์ ๋ ๋ฒ์ ์ผ๋ก ๋ฎ์ด ์ฐ์ฌ์ง๊ฒ ๋ฉ๋๋ค.
swiftlint autocorrect
๋ฅผ ์คํํ๊ธฐ ์ ์ ํ์ผ๋ค์ ๋ฐฑ์
ํด์ฃผ์ธ์. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค์ํ ๋ฐ์ดํฐ๊ฐ ์ ์ค๋ ์๋ ์์ต๋๋ค.
ํ์ค ๋ฆฐํธ ๊ฒ์ฌ๋ ์๋ ์์ ์ค์๋ ๋นํ์ฑํ๋ฉ๋๋ค. ์๋ฐ ์ฌํญ๋ค์ ํ์ผ์ด ์๋ ์์ ๋ ํ์ ๋์ด์ ์ ํจํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ํฌ๊ธฐ ๋๋ฌธ์ ๋๋ค.
SwiftLint๋ Realm Inc.์ ์ํด ๋ง๋ค์ด์ ธ์ ๊ด๋ฆฌ๋๊ณ ์์ต๋๋ค. Realm์ ์ด๋ฆ๊ณผ ๋ก๊ณ ๋ Realm Inc.์ ํธ๋ ์ด๋ ๋งํฌ์ ๋๋ค.
์ฐ๋ฆฌ๋ ์คํ ์์ค ์ํํธ์จ์ด๋ฅผ ์ฌ๋ํฉ๋๋ค:heart:! Realm์ ๋ค๋ฅธ ์คํ์์ค ํ๋ก์ ํธ์ ๋ธ๋ก๊ทธ๋ค๋ ๋ค๋ฌ์ฃผ์๊ณ , ํธ์ํฐ(@realm)๋ก๋ ๋ฐ๊ฐ๊ฒ ์ธ์ฌ ์ฃผ์ธ์.