현재 보관 된 Github Swift 스타일 가이드를 기반으로 신속한 스타일 및 컨벤션을 시행하는 도구. SwiftLint는 Swift 커뮤니티가 일반적으로 받아들이는 스타일 가이드 규칙을 시행합니다. 이 규칙은 Kodeco의 Swift 스타일 가이드와 같은 인기있는 스타일 가이드에 잘 설명되어 있습니다.
SwiftLint는 Clang과 SourceKit에 연결하여 소스 파일의 AST 표현을 사용하여보다 정확한 결과를 얻습니다.
SwiftLint는 명령 플러그인 또는 빌드 도구 플러그인으로 사용할 수 있습니다.
추가하다
. package ( url : " https://github.com/SimplyDanny/SwiftLintPlugins " , from : " <version> " )
SwiftLint의 최신 릴리스를 자동으로 소비하거나 종속성을 특정 버전으로 고정하려면 Package.swift
파일에 다음과 같습니다.
. package ( url : " https://github.com/SimplyDanny/SwiftLintPlugins " , exact : " <version> " )
여기에서 <version>
원하는 최소 또는 정확한 버전으로 바꾸십시오.
메모
SwiftLint 저장소에서 직접 플러그인을 소비하면 몇 가지 단점이 있습니다. 그것들을 피하고 부과 된 오버 헤드를 줄이기 위해 SwiftLint 저장소의 플러그인도 절대적으로 기능적이지만 전용 SwiftLintplugins 저장소에서 플러그인을 소비하는 것이 좋습니다. SwiftLint의 플러그인이 선호되는 경우 위의 패키지 선언에서 URL https://github.com/realm/SwiftLint
사용하십시오.
그러나 SwiftLintplugins는 플러그인 채택을 대규모로 용이하게합니다. SwiftLint 자체가 제공 한대로 플러그인을 구동하는 몇 가지 이유가 매우 번거 롭습니다. 플러그인 코드와 릴리스가 동기화되므로 두 가지간에 기능에는 차이가 없지만 전용 플러그인 저장소를 사용하는 데 많은 시간과 문제가 발생합니다.
이 문서는 Swiftlintplugins에 의존한다고 가정합니다.
다음 링크를 사용하여 Xcode 프로젝트에 패키지 종속성으로 SwiftLint를 추가하십시오.
https://github.com/SimplyDanny/SwiftLintPlugins
brew install swiftlint
Podfile
에 다음을 추가하십시오.
pod 'SwiftLint'
이렇게하면 다음 pod install
실행 중에 SwiftLint Binaries 및 Dependencies를 Pods/
에서 다운로드하고 스크립트 빌드 단계에서 ${PODS_ROOT}/SwiftLint/swiftlint
통해이를 호출 할 수 있습니다.
Cocoapods를 통해 설치하면 단순히 최신 제품이 아닌 특정 버전의 Swiftlint에 고정 될 수 있습니다 (이는 홈 브루의 경우).
이것은 Swiftlint Binaries, 의존성의 바이너리 및 Pods/
Directory에 Swift Binary Library 배포를 추가하므로 GIT와 같은 SCM 에이 디렉토리를 확인하는 것이 권장되지 않습니다.
mint install realm/SwiftLint
이것을 MODULE.bazel
:
bazel_dep ( name = "swiftlint" , version = "0.52.4" , repo_name = "SwiftLint" )
또는 이것을 WORKSPACE
에 넣으십시오.
load ( "@bazel_tools//tools/build_defs/repo:http.bzl" , "http_archive" )
http_archive (
name = "build_bazel_rules_apple" ,
sha256 = "390841dd5f8a85fc25776684f4793d56e21b098dfd7243cd145b9831e6ef8be6" ,
url = "https://github.com/bazelbuild/rules_apple/releases/download/2.4.1/rules_apple.2.4.1.tar.gz" ,
)
load (
"@build_bazel_rules_apple//apple:repositories.bzl" ,
"apple_rules_dependencies" ,
)
apple_rules_dependencies ()
load (
"@build_bazel_rules_swift//swift:repositories.bzl" ,
"swift_rules_dependencies" ,
)
swift_rules_dependencies ()
load (
"@build_bazel_rules_swift//swift:extras.bzl" ,
"swift_rules_extra_dependencies" ,
)
swift_rules_extra_dependencies ()
http_archive (
name = "SwiftLint" ,
sha256 = "c6ea58b9c72082cdc1ada4a2d48273ecc355896ed72204cedcc586b6ccb8aca6" ,
url = "https://github.com/realm/SwiftLint/releases/download/0.52.4/bazel.tar.gz" ,
)
load ( "@SwiftLint//bazel:repos.bzl" , "swiftlint_repos" )
swiftlint_repos ()
load ( "@SwiftLint//bazel:deps.bzl" , "swiftlint_deps" )
swiftlint_deps ()
그런 다음이 명령으로 현재 디렉토리에서 SwiftLint를 실행할 수 있습니다.
bazel run -c opt @SwiftLint//:swiftlint
최신 GitHub 릴리스에서 SwiftLint.pkg
다운로드하여 실행하십시오.
빌드 도구 바젤과 최근 신속한 도구 체인이 설치되고 모든 도구가 PATH
에서 발견 될 수 있는지 확인하십시오.
SwiftLint를 구축하려면이 저장소를 복제하고 실행하면 make install
.
중요한
보풀 위반이있을 때 건물을 일찍 종료하기 위해 Swift 소스 파일을 컴파일하기 전에 SwiftLint를 실행하는 것이 직관적 인 것처럼 보이지만 SwiftLint는 컴파일 가능한 유효한 소스 코드를 분석하도록 설계되었음을 이해하는 것이 중요합니다. 비 컴파일 코드는 특히 --fix
/ --autocorrect
명령 줄 인수로 실행할 때 예기치 않은 혼란스러운 결과로 이어질 수 있습니다.
SwiftLint는 Swift 패키지 프로젝트 및 Xcode 프로젝트를위한 빌드 도구 플러그인으로 사용할 수 있습니다.
빌드 도구 플러그인은 패키지/프로젝트 디렉토리 내에서 최상위 구성 파일을 찾아 SwiftLint Working Directory를 결정합니다. 구성 파일을 찾을 수없는 경우 패키지/프로젝트 디렉토리는 작업 디렉토리로 사용됩니다.
플러그인은 SwiftLint Working Directory를 해결할 수 없을 때 오류가 발생합니다. 예를 들어, 이는 대상의 신속한 파일이 프로젝트 디렉토리 내에 있지 않은 Xcode 프로젝트에서 발생합니다.
플러그인과의 호환성을 극대화하려면 --config
그 옵션을 사용해야하는 프로젝트 구조를 피하십시오.
메모
Swift 패키지 관리자를 통해 설치해야합니다.
각 대상을 구축 할 때 도구 플러그인을 빌드하십시오. 프로젝트에 여러 대상이있는 경우 플러그인을 원하는 대상에 개별적으로 추가해야합니다.
이렇게하려면 플러그인을 대상에 추가 할 예정입니다.
. target (
...
plugins : [ . plugin ( name : " SwiftLintBuildToolPlugin " , package : " SwiftLintPlugins " ) ]
) ,
메모
Swift 패키지 관리자를 통해 설치해야합니다.
명령 플러그인을 사용하면 다음과 같이 명령 줄에서 SwiftLint를 실행할 수 있습니다.
swift package plugin swiftlint
메모
Xcode 패키지 종속성을 통해 설치해야합니다.
빌드 도구 플러그인은 각 대상의 빌드 단계로 실행됩니다. 프로젝트에 여러 대상이있는 경우 플러그인을 원하는 대상에 개별적으로 추가해야합니다.
이렇게하려면 대상이 보풀을 늘리기위한 Build Phases
의 Run Build Tool Plug-ins
단계에 SwiftLintBuildToolPlugin
을 추가하십시오.
팁
플러그인을 처음 사용하는 경우 프롬프트를 신뢰하고 활성화해야합니다. 매크로 빌드 경고가 존재하는 경우, 매크로를 신뢰하고 활성화하도록 선택하십시오.
무인 사용 (예 : CI에서)의 경우 다음 중 하나에서 패키지 플러그인 및 매크로 검증을 비활성화 할 수 있습니다.
xcodebuild
옵션 사용 :
-skipPackagePluginValidation
-skipMacroValidation
Xcode 기본값 설정 :
defaults write com.apple.dt.Xcode IDESkipPackagePluginFingerprintValidatation -bool YES
defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES
중요한
무인 사용 옵션은 Xcode의 검증 대화 상자를 우회하고 보안에 영향을 미치는 모든 플러그인 및 매크로를 암시 적으로 신뢰합니다.
SwiftLint의 구성 파일이 패키지/프로젝트 디렉토리 외부에있는 프로젝트 구조는 빌드 도구 플러그인에서 직접 지원되지 않습니다. 이는 도구 플러그인을 구축하기 위해 인수를 전달할 수 없기 때문입니다 (예 : 구성 파일 경로를 전달).
프로젝트 구조가 빌드 도구 플러그인과 직접 작동하지 않으면 다음 옵션 중 하나를 고려하십시오.
parent_config: path/to/.swiftlint.yml
추가 될 수 있습니다.메모
사용 된 설치 방법에 따라 실행 스크립트 빌드 단계의 Shell Command Syntax는 다를 수 있거나 추가 구성이 필요할 수 있습니다. 자세한 내용은 설치 지침을 참조하십시오.
빌드 도구 플러그인이 프로젝트 설정에서 작동하지 않거나 추가 사용자 정의 설정이 필요한 경우 SwiftLint를 실행 스크립트 빌드 단계로 추가 할 수 있습니다. 이것은 프로젝트 설정이 --config
swiftlint 옵션에 의존 할 때 유용합니다. 또는 단일 swiftlint
호출로 모든 대상을 함께 보려고합니다. 파일 포함 및 제외는 .swiftlint.yml
구성에서 구성 할 수 있습니다.
이를 위해 Compile Sources
단계 후 기본 앱 대상의 Build Phases
의 Run Script
단계에 사용자 정의 스크립트를 추가하십시오. 다음 스크립트 구현을 사용하십시오.
if command -v swiftlint > /dev/null 2>&1
then
swiftlint
else
echo " warning: ` swiftlint ` command not found - See https://github.com/realm/SwiftLint#installation for installation instructions. "
fi
Swift 패키지에서 SwiftLintplugin을 사용하는 경우 다음과 같은 방식으로 swiftlint
실행 파일을 참조 할 수 있습니다.
SWIFT_PACKAGE_DIR= " ${BUILD_DIR % Build /* } SourcePackages/artifacts "
SWIFTLINT_CMD= $( ls " $SWIFT_PACKAGE_DIR " /swiftlintplugins/SwiftLintBinary/SwiftLintBinary.artifactbundle/swiftlint- * /bin/swiftlint | head -n 1 )
if test -f " $SWIFTLINT_CMD " 2>&1
then
" $SWIFTLINT_CMD "
else
echo " warning: ` swiftlint ` command not found - See https://github.com/realm/SwiftLint#installation for installation instructions. "
fi
메모
SWIFTLINT_CMD
경로는 기본 Xcode 구성을 사용하며 Xcode 15/16에서 테스트되었습니다. 다른 구성 (예 : 사용자 정의 스위프트 패키지 경로)의 경우 그에 따라 값을 조정하십시오.
팁
모든 증분 빌드에서 swiftlint
실행하기 위해 Based on dependency analysis
확인하여 지정되지 않은 출력 경고를 억제하십시오.
Xcode 15는 ENABLE_USER_SCRIPT_SANDBOXING
build 설정의 기본값을 NO
로 설정하여 상당한 변경을 YES
. 결과적으로 Swiftlint는 누락 된 파일 권한과 관련된 오류를 만나며, 일반적으로 error: Sandbox: swiftlint(19427) deny(1) file-read-data.
이 문제를 해결하려면 SwiftLint가 구성되는 특정 대상에 대해 ENABLE_USER_SCRIPT_SANDBOXING
설정을 수동 NO
설정해야합니다.
Apple Silicon에 Homebrew를 통해 SwiftLint를 설치 한 경우이 경고를 경험할 수 있습니다.
warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint
Apple Silicon의 Homebrew가 기본적으로 /opt/homebrew/bin
폴더에 바이너리를 설치하기 때문입니다. SwiftLint를 찾을 위치를 Xcode에게 지시하려면 빌드 단계의 PATH
환경 변수에 /opt/homebrew/bin
추가 할 수 있습니다.
if [[ " $( uname -m ) " == arm64 ]]
then
export PATH= " /opt/homebrew/bin: $PATH "
fi
if command -v swiftlint > /dev/null 2>&1
then
swiftlint
else
echo " warning: ` swiftlint ` command not found - See https://github.com/realm/SwiftLint#installation for installation instructions. "
fi
또는 실제 바이너리를 가리키는 /usr/local/bin
에서 상징적 링크를 만들 수 있습니다.
ln -s /opt/homebrew/bin/swiftlint /usr/local/bin/swiftlint
위반을 고치려면 스크립트가 swiftlint
대신 swiftlint --fix && swiftlint
실행할 수 있습니다. 이는 모든 수정 가능한 위반이 고정되어야하며 프로젝트에 대한 경고가 남아있는 위반에 대한 경고를 보장한다는 것을 의미합니다.
Cocoapods를 통해 SwiftLint를 설치 한 경우 스크립트는 다음과 같습니다.
" ${PODS_ROOT} /SwiftLint/swiftlint "
SwiftLint를 Visual Studio 코드와 통합하려면 시장에서 vscode-swiftlint
확장을 설치하십시오.
FastLane 프로세스의 일환으로 공식 swiftlint
Fastlane 액션을 사용하여 SwiftLint를 실행할 수 있습니다.
swiftlint (
mode : :lint , # SwiftLint mode: :lint (default) or :autocorrect
executable : "Pods/SwiftLint/swiftlint" , # The SwiftLint binary path (optional). Important if you've installed it via CocoaPods
path : "/path/to/lint" , # Specify path to lint (optional)
output_file : "swiftlint.result.json" , # The path of the output file (optional)
reporter : "json" , # The custom reporter to use (optional)
config_file : ".swiftlint-ci.yml" , # The path of the configuration file (optional)
files : [ # List of files to process (optional)
"AppDelegate.swift" ,
"path/to/project/Model.swift"
] ,
ignore_exit_status : true , # Allow fastlane to continue even if SwiftLint returns a non-zero exit status (Default: false)
quiet : true , # Don't print status logs like 'Linting ' & 'Done linting' (Default: false)
strict : true # Fail on warnings? (Default: false)
)
SwiftLint는 Ubuntu
사용하여 Docker 이미지로도 제공됩니다. 따라서 다음 명령을 사용하여 Docker 이미지를 처음 가져와야 할 때.
docker pull ghcr.io/realm/swiftlint:latest
그런 다음 다음 시간에 Docker 내부에서 swiftlint
실행합니다.
docker run -it -v ` pwd ` : ` pwd ` -w ` pwd ` ghcr.io/realm/swiftlint:latest
이것은 현재 위치에있는 폴더에서 swiftlint
실행하여 pwd
과 같은 출력을 표시합니다.
$ docker run -it -v ` pwd ` : ` pwd ` -w ` pwd ` ghcr.io/realm/swiftlint:latest
Linting Swift files in current working directory
Linting ' RuleDocumentation.swift ' (1/490)
...
Linting ' YamlSwiftLintTests.swift ' (490/490)
Done linting ! Found 0 violations, 0 serious in 490 files.
여기에는 Docker 이미지 사용에 대한 더 많은 문서가 있습니다.
$ swiftlint help
OVERVIEW: A tool to enforce Swift style and conventions.
USAGE: swiftlint <subcommand>
OPTIONS:
--version Show the version.
-h, --help Show help information.
SUBCOMMANDS:
analyze Run analysis rules
docs Open SwiftLint documentation website in the default web browser
generate-docs Generates markdown documentation for selected group of rules
lint (default) Print lint warnings and errors
baseline Operations on existing baselines
reporters Display the list of reporters and their identifiers
rules Display the list of rules and their identifiers
version Display the current version of SwiftLint
See 'swiftlint help <subcommand>' for detailed help.
Swift 파일이 포함 된 디렉토리에서 swiftlint
실행하십시오. 디렉토리는 재귀 적으로 검색됩니다.
lint
또는 analyze
사용할 때 파일 목록을 지정하려면 ( ExtraBuildPhase
Xcode 플러그인으로 지정된 Xcode로 수정 된 파일 목록 또는 git ls-files -m
기반으로 작업 트리의 수정 된 파일) 옵션 --use-script-input-files
및 다음 인스턴스 변수 설정 : SCRIPT_INPUT_FILE_COUNT
및 SCRIPT_INPUT_FILE_0
, SCRIPT_INPUT_FILE_1
, ..., SCRIPT_INPUT_FILE_{SCRIPT_INPUT_FILE_COUNT - 1}
. 마찬가지로, 옵션을 전달하고 다음 인스턴스 변수를 설정하여 파일 목록에서 파일을 읽을 수 있습니다. SCRIPT_INPUT_FILE_LIST_COUNT
및 --use-script-input-file-lists
, SCRIPT_INPUT_FILE_LIST_1
, ..., SCRIPT_INPUT_FILE_LIST_{SCRIPT_INPUT_FILE_LIST_COUNT - 1}
SCRIPT_INPUT_FILE_LIST_0
이들은 입력 파일을 사용자 정의 Xcode 스크립트 단계로 설정하는 것과 동일한 환경 변수입니다.
Swiftlint는 Sourcekit에 연결되어 Swift가 발전하더라도 계속 작동합니다!
이것은 또한 완전한 신속한 컴파일러로 배송 할 필요가 없기 때문에 SwiftLint Lean을 유지합니다. 이미 컴퓨터에 설치 한 공식 제품과 통신합니다.
코드를 컴파일하는 데 사용하는 것과 동일한 도구 체인으로 항상 SwiftLint를 실행해야합니다.
여러 툴체인 또는 Xcodes가 설치된 경우 SwiftLint의 기본 Swift Toolchain을 무시할 수 있습니다.
SwiftLint가 사용할 신속한 도구 체인을 결정하는 순서는 다음과 같습니다.
$XCODE_DEFAULT_TOOLCHAIN_OVERRIDE
$TOOLCHAIN_DIR
또는 $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/
서브 디렉토리에서 찾을 것으로 예상됩니다.
또한 Swift Toolchain 버전을 식별하는 Reverse-DNS 표기법으로 TOOLCHAINS
환경 변수를 설정할 수도 있습니다.
TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 swiftlint --fix
Linux에서 SourceKit은 /usr/lib/libsourcekitdInProc.so
에 위치하거나 LINUX_SOURCEKIT_LIB_PATH
환경 변수에 의해 지정 될 것으로 예상됩니다.
pre-commit
후크 SwiftLint는 사전 커밋 후크로 실행할 수 있습니다. 설치되면 저장소의 루트에있는 .pre-commit-config.yaml
에 이것을 추가하십시오.
repos :
- repo : https://github.com/realm/SwiftLint
rev : 0.50.3
hooks :
- id : swiftlint
선택한 SwiftLint 버전으로 rev
조정하십시오. pre-commit autoupdate
사용하여 현재 버전으로 업데이트 할 수 있습니다.
SwiftLint는 entry
사용하여 구성하여 수정을 적용하고 오류에 실패 할 수 있습니다.
- repo : https://github.com/realm/SwiftLint
rev : 0.50.3
hooks :
- id : swiftlint
entry : swiftlint --fix --strict
Swiftlint에는 200 개가 넘는 규칙이 포함되어 있으며 Swift Community (That You!)는 시간이 지남에 따라 계속 더 기여합니다. 풀 요청이 권장됩니다.
업데이트 된 규칙 목록과 그에 대한 자세한 내용은 여기에서 찾을 수 있습니다.
소스/SwiftLintBuiltInrules/Rules Directory를 확인하여 구현을 확인할 수도 있습니다.
opt_in_rules
기본적으로 비활성화되어 있습니다 (즉, 구성 파일에서 명시 적으로 활성화해야합니다).
규칙을 옵트 인으로 표시 할시기에 대한 지침 :
empty_count
)force_unwrapping
)다음 형식의 소스 파일 내부의 주석으로 규칙을 비활성화 할 수 있습니다.
// swiftlint:disable <rule1> [<rule2> <rule3>...]
규칙은 파일 끝까지 또는 Linter가 일치하는 댓글을 볼 때까지 비활성화됩니다.
// swiftlint:enable <rule1> [<rule2> <rule3>...]
예를 들어:
// swiftlint:disable colon
let noWarning : String = " " // No warning about colons immediately after variable names!
// swiftlint:enable colon
let hasWarning : String = " " // Warning generated about colons immediately after variable names
all
키워드를 포함하면 Linter가 일치하는 enable 댓글을 볼 때까지 모든 규칙을 비활성화합니다.
// swiftlint:disable all
// swiftlint:enable all
예를 들어:
// swiftlint:disable all
let noWarning : String = " " // No warning about colons immediately after variable names!
let i = " " // Also no warning about short identifier names
// swiftlint:enable all
let hasWarning : String = " " // Warning generated about colons immediately after variable names
let y = " " // Warning generated about short identifier names
추가 :previous
, :this
(현재) 또는 다음 줄에 명령을 적용하기 위해서는 :next
과 같이 추가하여 disable
또는 enable
명령을 수정할 수도 있습니다.
예를 들어:
// 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
: 기본 세트의 일부가 아닌 규칙을 활성화합니다. 특수 all
식별자는 disabled_rules
에 나열된 규칙을 제외하고 모든 옵트의 선원 규칙을 활성화합니다.only_rules
:이 목록에 지정된 규칙 만 활성화됩니다. disabled_rules
또는 opt_in_rules
와 함께 지정할 수 없습니다.analyzer_rules
: 이것은 analyze
명령에 의해서만 실행되는 완전히 별도의 규칙 목록입니다. 모든 분석기 규칙은 옵트 인이므로 유일하게 구성 가능한 규칙 목록이므로 disabled_rules
및 only_rules
에 대한 동등한 부분이 없습니다. 특수 all
식별자는 여기에서 disabled_rules
에 나열된 규칙을 제외하고 모든 분석기 규칙을 활성화하기 위해 여기에서 사용할 수 있습니다. # By default, SwiftLint uses a set of sensible default rules you can adjust:
disabled_rules : # rule identifiers turned on by default to exclude from running
- colon
- comma
- control_statement
opt_in_rules : # some rules are turned off by default, so you need to opt-in
- empty_count # find all the available rules by running: `swiftlint rules`
# Alternatively, specify all rules explicitly by uncommenting this option:
# only_rules: # delete `disabled_rules` & `opt_in_rules` if using this
# - empty_parameters
# - vertical_whitespace
analyzer_rules : # rules run by `swiftlint analyze`
- explicit_self
# Case-sensitive paths to include during linting. Directory paths supplied on the
# command line will be ignored.
included :
- Sources
excluded : # case-sensitive paths to ignore during linting. Takes precedence over `included`
- Carthage
- Pods
- Sources/ExcludedFolder
- Sources/ExcludedFile.swift
- Sources/*/ExcludedFile.swift # exclude files with a wildcard
# If true, SwiftLint will not fail if no lintable files are found.
allow_zero_lintable_files : false
# If true, SwiftLint will treat all warnings as errors.
strict : false
# If true, SwiftLint will treat all errors as warnings.
lenient : false
# The path to a baseline file, which will be used to filter out detected violations.
baseline : Baseline.json
# The path to save detected violations to as a new baseline.
write_baseline : Baseline.json
# If true, SwiftLint will check for updates after linting or analyzing.
check_for_updates : true
# configurable rules can be customized from this configuration file
# binary rules can set their severity level
force_cast : warning # implicitly
force_try :
severity : warning # explicitly
# rules that have both warning and error levels, can set just the warning level
# implicitly
line_length : 110
# they can set both implicitly with an array
type_body_length :
- 300 # warning
- 400 # error
# or they can set both explicitly
file_length :
warning : 500
error : 1200
# naming rules can set warnings/errors for min_length and max_length
# additionally they can set excluded names
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, summary)
문자열에서 ${SOME_VARIABLE}
사용하여 구성 파일에서 환경 변수를 사용할 수도 있습니다.
주요 SwiftLint 프로젝트가 제공하는 규칙 외에도 SwiftLint는 자신의 프로젝트에서 자신을 정의 할 수있는 두 가지 유형의 사용자 정의 규칙을 실행할 수 있습니다.
이 규칙은 SwiftLint와 함께 배송되는 Swift 기반 규칙과 동일한 방식으로 작성되어 빠르고 정확하며 Swiftyntax를 활용할 수 있으며 단위 테스트 등을 수행 할 수 있습니다.
이를 사용하려면이 비디오 또는 github.com/jpsim/swiftlint-bazel-example의 관련 코드에 설명 된대로 바젤을 사용하여 SwiftLint를 구축해야합니다.
다음 구문을 사용하여 구성 파일에서 사용자 정의 regex 기반 규칙을 정의 할 수 있습니다.
custom_rules :
pirates_beat_ninjas : # rule identifier
included :
- " .* \ .swift " # regex that defines paths to include during linting. optional.
excluded :
- " .*Test \ .swift " # regex that defines paths to exclude during linting. optional
name : " Pirates Beat Ninjas " # rule name. optional.
regex : " ([nN]inja) " # matching pattern
capture_group : 0 # number of regex capture group to highlight the rule violation at. optional.
match_kinds : # SyntaxKinds to match. optional.
- comment
- identifier
message : " Pirates are better than ninjas. " # violation message. optional.
severity : error # violation severity. optional.
no_hiding_in_strings :
regex : " ([nN]inja) "
match_kinds : string
이것이 출력의 모습입니다.
정규 표현 패턴은 플래그 s
및 m
활성화와 함께 사용된다는 점에 유의해야합니다 .
Newlines와 일치하고 ^
/ $
각각 라인의 시작과 끝과 일치합니다. 당신이 갖고 싶지 않다면 .
예를 들어, 성과는 (?-s)
에 의해 선불 될 수 있습니다.
하나 이상의 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
신속한 코드 스 니펫에 사용 된 모든 구문 종류는 SourceKitten에게 요청하여 추출 할 수 있습니다. 예를 들어, sourcekitten syntax --text "struct S {}"
가 전달됩니다
source.lang.swift.syntaxtype.keyword
의 struct
키워드source.lang.swift.syntaxtype.identifier
이름에 대한 S
위 목록에서 keyword
및 identifier
와 일치합니다.
only_rules
와 함께 사용자 정의 규칙을 사용하는 경우 only_rules
목록에 문자 그대로 String custom_rules
포함시켜야합니다.
only_rules :
- custom_rules
custom_rules :
no_hiding_in_strings :
regex : " ([nN]inja) "
match_kinds : string
Swift 사용자 정의 규칙과 달리 공식 SwiftLint Builds (예 : Homebrew)를 사용하여 Regex 사용자 정의 규칙을 실행할 수 있습니다.
SwiftLint는 특정 위반을 자동으로 수정할 수 있습니다. 디스크의 파일은 수정 된 버전으로 덮어 씁니다.
swiftlint --fix
실행하기 전에 이러한 파일의 백업이 있는지 확인하십시오. 그렇지 않으면 중요한 데이터가 손실 될 수 있습니다.
수정을 적용하는 동안 파일을 수정 한 후 위반 (또는 오프셋)이 잘못 될 가능성이 높기 때문에 표준 라인이 비활성화됩니다.
swiftlint analyze
명령은 전체 유형 검사 AST를 사용하여 Swift 파일을 보린 할 수 있습니다. Clean swiftc
빌드 명령 호출을 포함하는 컴파일러 로그 경로 (증분 빌드가 실패)를 전달하여 --compiler-log-path
플래그를 통해 analyze
해야합니다. 예를 들어 --compiler-log-path /path/to/xcodebuild.log
이것은 얻을 수 있습니다
xcodebuild -workspace {WORKSPACE}.xcworkspace -scheme {SCHEME} > xcodebuild.log
실행합니다swiftlint analyze --compiler-log-path xcodebuild.log
분석기 규칙은 보풀 규칙보다 상당히 느린 경향이 있습니다.
SwiftLint는 여러 구성 파일을 포함시키는 다양한 방법을 제공합니다. 여러 구성 파일이 하나의 단일 구성으로 병합되어 단일 구성 파일이 적용되는 것처럼 적용됩니다.
여러 구성 파일을 사용하는 것이 도움이 될 수있는 사용 사례가 많이 있습니다.
예를 들어, 팀 전체의 공유 SwiftLint 구성을 사용하면서 자식 구성 파일을 통해 각 프로젝트에서 재정의를 허용 할 수 있습니다.
팀 전체 구성 :
disabled_rules :
- force_cast
프로젝트 별 구성 :
opt_in_rules :
- force_cast
구성 파일 내에 child_config
및/또는 parent_config
참조를 지정할 수 있습니다. 이 참조는 그들이 지정된 구성 파일의 폴더와 관련하여 로컬 경로 여야합니다. 이것은 사이클과 모호성이없는 한 재귀 적으로 작동합니다.
자식 구성은 세분화로 취급되므로 우선 순위가 높으며 부모 구성은 충돌의 경우 우선 순위가 낮은 기반으로 간주됩니다.
다음은 다음과 같은 파일 구조가 있다고 가정합니다.
ProjectRoot
|_ .swiftlint.yml
|_ .swiftlint_refinement.yml
|_ Base
|_ .swiftlint_base.yml
정제와 기본 파일을 모두 포함하려면 .swiftlint.yml
이 다음과 같습니다.
child_config : .swiftlint_refinement.yml
parent_config : Base/.swiftlint_base.yml
included
및 excluded
구성을 병합 할 때는 구성 파일의 디렉토리 위치의 차이를 설명하기 위해 신중하게 처리됩니다.
로컬 child_config
/ parent_config
참조를 제공 할 수있는 것처럼 로컬 경로를 참조하는 대신 구성 파일로 이어지는 URL을 넣을 수 있습니다. SwiftLint가 이러한 원격 참조를 감지하려면 http://
또는 https://
부터 시작해야합니다.
참조 된 원격 구성 파일은 다른 원격 구성 파일을 재귀 적으로 참조 할 수도 있지만 로컬 참조를 포함 할 수는 없습니다.
원격 참조를 사용하면 .swiftlint.yml
이 다음과 같습니다.
parent_config : https://myteamserver.com/our-base-swiftlint-config.yml
SwiftLint를 실행하고 인터넷에 연결할 때마다 SwiftLint는 참조되는 모든 원격 구성의 새 버전을 얻으려고합니다. 이 요청이 시간을 초과하면 캐시 된 버전이 사용 가능한 경우 사용됩니다. 캐시 된 버전이 없으면 SwiftLint가 실패하지만 걱정하지 않으면 SwiftLint가 적어도 한 번 성공적으로 실행되면 캐시 버전이 있어야합니다.
필요한 경우 원격 구성 페치의 타임 아웃은 remote_timeout
/ remote_timeout_if_cached
지정기를 사용하여 구성 파일을 통해 수동으로 지정할 수 있습니다. 이 값은 각각 2 초 또는 1 초입니다.
명령 줄을 통해 SwiftLint를 실행할 때 하나의 구성 파일을 제공하는 대신 첫 번째 구성이 부모로 취급되는 반면 마지막 구성은 가장 우선 순위가 높은 자식으로 취급되는 계층 구조를 전달할 수도 있습니다.
두 개의 구성 파일을 포함한 간단한 예는 다음과 같습니다.
swiftlint --config .swiftlint.yml --config .swiftlint_child.yml
기본 구성 (루트 폴더의 .swiftlint.yml
파일) 외에도 .swiftlint.yml
이라는 다른 구성 파일을 디렉토리 구조에 넣은 다음 하위 구성으로 병합 될 수 있지만 효과가 있습니다. 구성과 동일한 디렉토리 또는 다른 구성 파일이없는 더 깊은 디렉토리에있는 파일. 다시 말해, 중첩 구성은 재귀 적으로 작동하지 않습니다. 기본 구성 외에 적용될 수있는 파일 당 최대 1 개의 중첩 구성 수가 있습니다.
.swiftlint.yml
파일은 이미 기본 구성을 빌드하는 데 사용되지 않은 경우에만 중첩 구성으로 간주됩니다 (예 : child_config: Folder/.swiftlint.yml
과 같은 것을 통해 참조 함). 또한 중첩 구성의 parent_config
/ child_config
사양은 이해가 없기 때문에 무시됩니다.
하나 (또는 그 이상) SwiftLint 파일이 --config
매개 변수를 통해 명시 적으로 지정된 경우, 해당 구성은 디렉토리 어딘가에 다른 .swiftlint.yml
파일이 있든 상관없이 재정의로 처리됩니다. 따라서 중첩 구성을 사용하려면 --config
그 매개 변수를 사용할 수 없습니다.
MIT 라이센스.
Swiftlint는 Realm Inc.에서 유지 관리 및 자금을 조달합니다. 영역의 이름과 로고는 Realm Inc.의 상표입니다.
우리는 오픈 소스 소프트웨어! 다른 오픈 소스 프로젝트를보고 블로그를 읽거나 트위터 (@Realm)에서 인사하십시오.
성능 테스트를 실행하기위한 Mac Mini를 제공 한 MacStadium에게 감사드립니다.