Инструмент для обеспечения соблюдения Swift Style и соглашений, основанный на ныне архивном руководстве Github Swift. Swiftlint обеспечивает соблюдение правил руководства по стилю, которые обычно принимаются сообществом Swift. Эти правила хорошо описаны в руководствах по популярному стилю, таким как руководство Kodeco Swift Style.
Swiftlint крючна в Clang и Sourcekit, чтобы использовать представление AST ваших исходных файлов для более точных результатов.
Swiftlint может использоваться в качестве командного плагина или плагина для инструмента сборки.
Добавлять
. package ( url : " https://github.com/SimplyDanny/SwiftLintPlugins " , from : " <version> " )
В ваш Package.swift
файл для автоматического использования последнего выпуска Swiftlint или прикрепите зависимость к конкретной версии:
. package ( url : " https://github.com/SimplyDanny/SwiftLintPlugins " , exact : " <version> " )
В этом, замените <version>
на желаемую минимальную или точную версию.
Примечание
Потребление плагинов непосредственно из репозитория Swiftlint поставляется с несколькими недостатками. Чтобы избежать их и уменьшить наложенные накладные расходы, настоятельно рекомендуется потреблять плагины из выделенного репозитория Swiftlintplugins, хотя плагины из репозитория Swiftlint также абсолютно функциональны. Если плагины от Swiftlint предпочтительнее, просто используйте URL https://github.com/realm/SwiftLint
в заявлениях о пакете выше.
Тем не менее, Swiftlintplugins значительно облегчает принятие плагинов. В нем перечислены некоторые из причин, которые управляют плагинами, как и Swiftlint, очень хлопотно. Поскольку код плагина и релизы хранятся в синхронизации, между ними нет различий в функциональности, но вы избавляете себя много времени и проблем, используя выделенные плагины.
Этот документ предполагает, что вы полагаетесь на Swiftlintplugins.
Используйте следующую ссылку, чтобы добавить Swiftlint в качестве зависимости пакета в проект Xcode:
https://github.com/SimplyDanny/SwiftLintPlugins
brew install swiftlint
Добавьте следующее в свой Podfile
:
pod 'SwiftLint'
Это загрузит двоичные файлы и зависимости Swiftlint в Pods/
во время вашего следующего выполнения pod install
и позволит вам вызвать его через ${PODS_ROOT}/SwiftLint/swiftlint
на этапах сценария.
Установка через кокопод также позволяет прикреплять к конкретной версии Swiftlint, а не просто последней (что имеет место с Homebrew).
Обратите внимание, что это добавит двоичные файлы Swiftlint, двоичные файлы зависимостей и распределение библиотеки быстрого библиотеки в Pods/
каталог, поэтому проверяет в этом каталоге SCM, такой как GIT.
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
Скачать SwiftLint.pkg
из последнего релиза Github и запустите его.
Убедитесь, что инструмент Build Bazel и недавний инструмент Swift установлены, и все инструменты обнаружены на вашем PATH
.
Чтобы построить Swiftlint, клонируйте этот репозиторий и запустите, make install
.
Важный
Хотя может показаться интуитивным запускать Swiftlint, прежде чем собирать Swift Source Files для выхода из сборки на ранней стадии, когда есть нарушения ворса, важно понимать, что Swiftlint предназначен для анализа действительного исходного кода, который можно компилироваться. Некомпилирующий код может очень легко привести к неожиданным и запутанным результатам, особенно при выполнении с помощью аргументов командной строки --fix
/ --autocorrect
.
Swiftlint может использоваться в качестве плагина инструмента для сборки как для Swift Package Projects, так и для проектов Xcode.
Плагин инструмента Build определяет рабочий каталог Swiftlint, обнаружив самый верхний файл конфигурации в каталоге пакета/проекта. Если в качестве рабочего каталога используется файл конфигурации, каталог пакета/проекта используется.
Плагин бросает ошибку, когда он не может разрешить рабочий каталог Swiftlint. Например, это произойдет в проектах Xcode, где файлы Swift цели не расположены в каталоге проектов.
Чтобы максимизировать совместимость с плагином, избегайте структур проектов, которые требуют использования опции --config
.
Примечание
Требуется установка через Swift Package Manager.
Строите плагины инструмента работают при создании каждой цели. Когда проект имеет несколько целей, плагин должен быть добавлен к желаемым целям индивидуально.
Для этого добавьте плагин в цель (ы), чтобы быть снятым следующим образом:
. target (
...
plugins : [ . plugin ( name : " SwiftLintBuildToolPlugin " , package : " SwiftLintPlugins " ) ]
) ,
Примечание
Требуется установка через Swift Package Manager.
Командный плагин позволяет запускать Swiftlint из командной строки следующим образом:
swift package plugin swiftlint
Примечание
Требуется установка через зависимость пакета Xcode.
Строительными плагинами инструмента работают как фаза сборки каждой цели. Когда проект имеет несколько целей, плагин должен быть добавлен к желаемым целям индивидуально.
Для этого добавьте SwiftLintBuildToolPlugin
в фазу Run Build Tool Plug-ins
Build Phases
для целей (ы), которые должны быть сняты.
Кончик
При первом использовании плагина обязательно доверяйте и включите его при запросе. Если существует предупреждение по строительству макросов, выберите его, чтобы доверять и включить и макросы.
Для использования без присмотра (например, на 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 расположен за пределами каталога пакета/проекта, не поддерживается напрямую под плагином инструмента Build. Это связано с тем, что невозможно передать аргументы для создания плагинов инструментов (например, прохождение пути файла конфигурации).
Если структура вашего проекта не работает напрямую с плагином инструмента Build, пожалуйста, рассмотрите один из следующих вариантов:
parent_config: path/to/.swiftlint.yml
.Примечание
На основании используемого метода установки синтаксис команды Shell в фазе сборки сценария прогона может быть различной, или может потребоваться дополнительная конфигурация. Обратитесь к инструкциям по установке для получения дополнительной информации.
Если плагин инструмента Build не работает для настройки вашего проекта или когда требуется дополнительная пользовательская настройка, Swiftlint может быть добавлен в качестве фазы сборки сценария. Это полезно, когда настройка проекта опирается на опцию --config
Swiftlint; Или снять все цели вместе в одном вызове swiftlint
. Включения и исключения файлов могут быть настроены в конфигурации .swiftlint.yml
.
Чтобы сделать это, добавьте пользовательский сценарий на этап Run Script
на Build Phases
основной цели APP после фазы Compile Sources
. Используйте следующую реализацию скрипта:
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
Если вы используете Swiftlintplugin в пакете Swift, вы можете ссылаться на исполняемый файл 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. В случае другой конфигурации (например, пользовательский путь пакета Swift), пожалуйста, адаптируйте значения.
Кончик
Снимите контроль Based on dependency analysis
чтобы запустить swiftlint
на всех постепенных сборках, подавляя предупреждение о неопределенных выходах.
Xcode 15 внес значительное изменение, установив значение по умолчанию на настройке сборки ENABLE_USER_SCRIPT_SANDBOXING
от NO
на YES
. В результате Swiftlint сталкивается с ошибкой, связанной с отсутствующими разрешениями файла, которая обычно проявляется как error: Sandbox: swiftlint(19427) deny(1) file-read-data.
Чтобы решить эту проблему, необходимо вручную установить настройку ENABLE_USER_SCRIPT_SANDBOXING
на NO
для конкретной цели, на которую настроен Swiftlint.
Если вы установили Swiftlint через Homebrew на Apple Silicon, вы можете испытать это предупреждение:
warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint
Это связано с тем, что Homebrew на Apple Silicon устанавливает бинарные файлы в папку /opt/homebrew/bin
по умолчанию. Чтобы инструктировать xcode, где найти Swiftlint, вы можете добавить /opt/homebrew/bin
к переменной среды PATH
в фазе сборки:
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 --fix && swiftlint
вместо просто swiftlint
. Это будет означать, что все исправляемые нарушения устанавливаются при обеспечении предупреждений в вашем проекте для оставшихся нарушений.
Если вы установили Swiftlint через кокопод, сценарий должен выглядеть так:
" ${PODS_ROOT} /SwiftLint/swiftlint "
Чтобы интегрировать Swiftlint с кодом Visual Studio, установите расширение vscode-swiftlint
с рынка.
Вы можете использовать официальное действие swiftlint
Fastlane, чтобы запустить Swiftlint как часть вашего процесса Fastlane.
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 также доступен в виде изображения Docker с использованием Ubuntu
. Так что в первый раз вам нужно вытащить изображение Docker, используя следующую команду:
docker pull ghcr.io/realm/swiftlint:latest
Затем, следуя временем, вы просто запускаете swiftlint
внутри Docker Like:
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.
Запустите swiftlint
в каталоге, содержащем файлы Swift в Lint. Каталоги будут искать рекурсивно.
Чтобы указать список файлов при использовании lint
или analyze
(например git ls-files -m
список файлов, измененный Xcode, указанный плагином ExtraBuildPhase
xcode, или модифицированные файлы в рабоче Option --use-script-input-files
и настройка следующих переменных экземпляра: SCRIPT_INPUT_FILE_COUNT
и SCRIPT_INPUT_FILE_0
, SCRIPT_INPUT_FILE_1
, ..., SCRIPT_INPUT_FILE_{SCRIPT_INPUT_FILE_COUNT - 1}
. Аналогичным образом, файлы могут быть прочитаны из списков файлов, передавая опцию --use-script-input-file-lists
и установив следующие переменные экземпляра: SCRIPT_INPUT_FILE_LIST_COUNT
и SCRIPT_INPUT_FILE_LIST_0
, SCRIPT_INPUT_FILE_LIST_1
, ..., SCRIPT_INPUT_FILE_LIST_{SCRIPT_INPUT_FILE_LIST_COUNT - 1}
Это одинаковые переменные среды, установленные для входных файлов на пользовательские фазы скрипта Xcode.
Swiftlint крючна в Sourcekit, поэтому он продолжает работать, даже когда Swift развивается!
Это также сохраняет Swiftlint Lean, так как не нужно отправлять с полным компилятором Swift, он просто общается с официальным, который вы уже установили на своей машине.
Вы всегда должны запускать Swiftlint с тем же набором инструментов, которые вы используете для компиляции вашего кода.
Возможно, вы захотите переопределить Swift Swift Chchain Swift Swift Swift Swift Swiftchain, если у вас установлено несколько инструментов или Xcodes.
Вот порядок, в котором Swiftlint определяет, какой Swift Toolchain использовать:
$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/
Suberirectory значения, пройденного в приведенных выше путях.
Вы также можете установить переменную среды TOOLCHAINS
для обозначения обратного DNS, которая идентифицирует версию Swift Toolchain:
TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 swiftlint --fix
На Linux ожидается, что SourceKit будет расположен в /usr/lib/libsourcekitdInProc.so
или указан в рамках переменной среды LINUX_SOURCEKIT_LIB_PATH
.
pre-commit
Hook Swiftlint можно запустить как крючок перед набором. После установки добавьте это в .pre-commit-config.yaml
repos :
- repo : https://github.com/realm/SwiftLint
rev : 0.50.3
hooks :
- id : swiftlint
Отрегулируйте rev
в версию Swiftlint по вашему выбору. pre-commit autoupdate
может использоваться для обновления текущей версии.
Swiftlint может быть настроен с использованием entry
для применения исправлений и сбоя при ошибках:
- repo : https://github.com/realm/SwiftLint
rev : 0.50.3
hooks :
- id : swiftlint
entry : swiftlint --fix --strict
Более 200 правил включены в Swiftlint, и Swift Community (это вы!) Продолжает вносить больше времени. Запросы на вытягивание рекомендуется.
Вы можете найти обновленный список правил и дополнительную информацию о них здесь.
Вы также можете проверить каталог Source/SwiftlintBuiltInrules/Rules, чтобы увидеть их реализацию.
opt_in_rules
отключены по умолчанию (то есть вы должны явно включить их в файл конфигурации).
Руководящие принципы о том, когда отмечать правило как заявление:
empty_count
force_unwrapping
)Правила могут быть отключены с комментарием внутри исходного файла со следующим форматом:
// swiftlint:disable <rule1> [<rule2> <rule3>...]
Правила будут отключены до конца файла или до тех пор, пока Линтер не увидит сопоставление комментариев:
// 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
ключевое слово отключит все правила до тех пор, пока Линтер не увидит сопоставление комментариев:
// 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
Также можно изменить команду 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
: включить правила, которые не являются частью набора по умолчанию. Специальный идентификатор all
будет включать в себя все правила Linter, за исключением тех, которые перечислены в 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 также может запускать два типа пользовательских правил, которые вы можете определить себя в своих собственных проектах:
Эти правила написаны так же, как и правила, основанные на Swift, которые поставляются с Swiftlint, поэтому они быстрые, точные, могут использовать Swiftsyntax, могут быть проверены на единицу и многое другое.
Использование их требует создания Swiftlint с Bazel, как описано в этом видео или связанный с ним код в github.com/jpsim/swiftlint-bazel-example.
Вы можете определить пользовательские правила на основе 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
Соответствует новым линиям и ^
/ $
совмещается с началом и конец строк соответственно. Если вы не хотите иметь .
Например, сопоставление новейшей, например, на корпорации можно приготовить (?-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
Все синтаксические виды, используемые в фрагменте Swift Code, можно извлечь с просьбой Sourcekitten. Например, sourcekitten syntax --text "struct S {}"
обеспечивает
source.lang.swift.syntaxtype.keyword
для ключевого слова struct
иsource.lang.swift.syntaxtype.identifier
для его названия S
которые совпадают с keyword
и identifier
в приведенном выше списке.
При использовании пользовательских правил в сочетании с only_rules
вы должны включить буквальную строку custom_rules
в список only_rules
:
only_rules :
- custom_rules
custom_rules :
no_hiding_in_strings :
regex : " ([nN]inja) "
match_kinds : string
В отличие от Swift Custom Rules, вы можете использовать официальные сборки Swiftlint (например, от Homebrew) для запуска пользовательских правил Regex.
Swiftlint может автоматически исправить определенные нарушения. Файлы на диске перезаписываются исправленной версией.
Пожалуйста, убедитесь, что убедитесь в резервном копировании этих файлов перед запуском swiftlint --fix
противном случае важные данные могут быть потеряны.
Стандартное линирование отключено при корректировке из -за высокой вероятности нарушений (или их смещений) неверными после изменения файла при применении исправлений.
Команда swiftlint analyze
может провести файлы Swift, используя полную проверку типа AST. Путь журнала компилятора, содержащий вызов команды Cleant swiftc
Build (инкрементные сборки могут пройти сбой), должен быть прошел для analyze
с помощью флага --compiler-log-path
. Например --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
Файлы, которые находятся в том же каталоге, что и конфигурация или в более глубоком каталоге, где нет другого файла конфигурации. Другими словами: вложенные конфигурации не работают рекурсивно - существует максимальное количество одной вложенной конфигурации на файл, который может быть применен в дополнение к основной конфигурации.
Файлы. .swiftlint.yml
рассматриваются как вложенная конфигурация только в том случае, если они уже не использовались для создания основной конфигурации (например, на то, что было ссылается через что -то вроде child_config: Folder/.swiftlint.yml
). Кроме того, спецификации parent_config
/ child_config
вложенных конфигураций игнорируются, потому что в этом нет смысла.
Если один (или более) файл Swiftlint (ы) явно указаны через параметр --config
, эта конфигурация будет рассматриваться как переопределение, независимо от того, существуют ли другие файлы. .swiftlint.yml
где -то в каталоге. Поэтому, если вы хотите использовать вложенные конфигурации, вы не можете использовать параметр --config
.
MIT лицензирован.
Swiftlint поддерживается и финансируется Realm Inc. Имена и логотипы для Realm являются товарными знаками Realm Inc.
Мы ❤ программное обеспечение с открытым исходным кодом! Посмотрите на наши другие проекты с открытым исходным кодом, прочитайте наш блог или скажите привет в Twitter (@Realm).
Мы благодарим Macstadium за предоставление Mac Mini для проведения наших тестов на производительность.