SwiftLint - Swiftのスタイルと規則を適用するためのツール。

(A tool to enforce Swift style and conventions.)

Created at: 2015-05-17 00:59:31
Language: Swift
License: MIT

SwiftLint

現在アーカイブされているGitHubSwiftスタイルガイドに大まかに基づいて、Swiftのスタイルと規則を適用するためのツール。SwiftLintは、Swiftコミュニティで一般的に受け入れられているスタイルガイドルールを適用します。これらのルールは、RayWenderlichのSwiftStyleGuideなどの一般的なスタイルガイドで詳しく説明されています。

SwiftLintはClangSourceKitにフックして、ソースファイルのAST表現を使用し てより正確な結果を出します。

ビルドステータス codecov.io

このプロジェクトは、コントリビューター規約の行動規範に準拠しています。参加することにより、あなたはこの規範を支持することが期待されます。許容できない動作をinfo@realm.ioに報告してください。

言語スイッチ:中文한국어

インストール

自作の使用:

brew install swiftlint

CocoaPodsの使用:

Podfileに次の行を追加するだけです。

pod 'SwiftLint'

Pods/
これにより、次回の実行時に SwiftLintバイナリと依存関係がダウンロードさ れ、スクリプトビルドフェーズで
pod install
呼び出すことができます。
${PODS_ROOT}/SwiftLint/swiftlint

これは、SwiftLintの特定のバージョンをインストールするための推奨される方法です。これは、単に最新のものではなく、固定されたバージョンのインストールをサポートしているためです(Homebrewの場合)。

これにより、SwiftLintバイナリ、その依存関係のバイナリ、およびSwiftバイナリライブラリディストリビューションが

Pods/
ディレクトリに追加されるため、このディレクトリをgitなどのSCMにチェックインすることはお勧めしません。

Mintの使用:

$ mint install realm/SwiftLint

ビルド済みパッケージの使用:

最新のGitHubリリース

SwiftLint.pkg
から ダウンロードして実行することにより、SwiftLintをインストールすることもできます。

ソースからのインストール:

このプロジェクトのクローンを作成して実行することにより、ソースからビルドおよびインストールすることもできます

make install
(Xcode 13.3以降)。

Bazelの使用

これをあなたの中に入れてください

WORKSPACE

WORKSPACE
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "build_bazel_rules_apple",
    sha256 = "36072d4f3614d309d6a703da0dfe48684ec4c65a89611aeb9590b45af7a3e592",
    url = "https://github.com/bazelbuild/rules_apple/releases/download/1.0.1/rules_apple.1.0.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 = "1067cda5f77f31031f4f480fb80430e3f028720daf4b39ba483e2c09710a7dff",
    strip_prefix = "SwiftLint-93a69de005fcfdbda78cf79f1fc65756d938621c",
    url = "https://github.com/realm/SwiftLint/archive/93a69de005fcfdbda78cf79f1fc65756d938621c.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をプロジェクトに統合するための推奨される方法の概要を把握するには、このプレゼンテーションを見るか、トランスクリプトを読むことをお勧めします。

プレゼンテーション

Xcode

SwiftLintをXcodeプロジェクトに統合して、問題ナビゲーターに警告とエラーを表示します。

これを行うには、ファイルナビゲータでプロジェクトを選択し、次にプライマリアプリターゲットを選択して、ビルドフェーズに進みます。[+]をクリックして、[新しい実行スクリプトフェーズ]を選択します。スクリプトとして以下を挿入します。

AppleSiliconにHomebrew経由でSwiftLintをインストールした場合、次の警告が表示される場合があります。

警告:SwiftLintがインストールされていません。https://github.com/realm/SwiftLintからダウンロードしてください

これは、AppleSiliconのHomebrewが

/opt/homebrew/bin
デフォルトでバイナリをフォルダにインストールするためです。SwiftLintの場所をXcodeに指示する には、ビルドフェーズで環境変数に追加
/opt/homebrew/bin
することができます。
PATH

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

/usr/local/bin
または、実際のバイナリを指すシンボリックリンクを作成できます。

ln -s /opt/homebrew/bin/swiftlint /usr/local/bin/swiftlint

コンパイルする前にエラーをすばやく検出するために、「ソースのコンパイル」ステップの直前にSwiftLintフェーズを移動することをお勧めします。ただし、SwiftLintは、コンパイラの解析段階を完全に完了する有効なSwiftコードで実行するように設計されています。そのため、「ソースのコンパイル」の前にSwiftLintを実行すると、誤った結果が生じる可能性があります。

違反も修正したい場合は、スクリプトを 。

swiftlint --fix && swiftlint
だけでなく実行することもできます
swiftlint
。これは、残りの違反についてプロジェクトに警告が表示されるようにしながら、修正可能なすべての違反が修正されることを意味します。

CocoaPods経由でSwiftLintをインストールした場合、スクリプトは次のようになります。

"${PODS_ROOT}/SwiftLint/swiftlint"

AppCode

SwiftLintをAppCodeと統合するには、 このプラグインをインストールし、プラグインの設定でSwiftLintのインストール済みパスを構成します。

fix
アクションはを介して利用できます
⌥⏎

原子

SwiftLintをAtom

linter-swiftlint
と統合するには、APMからパッケージをインストールし ます。

VisualStudioコード

SwiftLintをvscodeと統合するに

vscode-swiftlint
は、マーケットプレイスから拡張機能をインストール します。

追い越し車線

公式のswiftlintfastlaneアクションを使用して、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)
)

Docker

swiftlint
を使用してDockerイメージとしても利用できます
Ubuntu
。したがって、初めて次のコマンドを使用してDockerイメージをプルする必要があります。

docker pull ghcr.io/realm/swiftlint:latest

その後、次

swiftlint
のようにDocker内を実行します。

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 all rules
  lint (default)          Print lint warnings and errors
  rules                   Display the list of rules and their identifiers
  version                 Display the current version of SwiftLint

  See 'swiftlint help <subcommand>' for detailed help.

swiftlint
lintするSwiftファイルを含むディレクトリで実行します。ディレクトリは再帰的に検索されます。

lint
またはを使用するときにファイルのリストを指定するには
analyze
(Xcodeプラグインによって指定されたXcodeによって変更されたファイルのリスト
ExtraBuildPhase
、またはに基づいて作業ツリー内の変更されたファイルのリストなど
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}
_

これらは、 カスタムXcodeスクリプトフェーズへの入力ファイルに設定されたものと同じ環境変数です。

複数のSwiftバージョンの操作

SwiftLintはSourceKitにフックするため、Swiftが進化しても機能し続けます。

これにより、SwiftLintは無駄のない状態に保たれます。これは、完全なSwiftコンパイラーを同梱する必要がなく、マシンに既にインストールされている公式コンパイラーと通信するだけです。

コードのコンパイルに使用するのと同じツールチェーンを使用して、常にSwiftLintを実行する必要があります。

複数のツールチェーンまたはXcodeがインストールされている場合は、SwiftLintのデフォルトのSwiftツールチェーンをオーバーライドすることをお勧めします。

SwiftLintが使用するSwiftツールチェーンを決定する順序は次のとおりです。

  • $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/
上記のパスで渡された値のサブディレクトリにあることが期待されます。

TOOLCHAINS
Swiftツールチェーンのバージョンを識別する逆DNS表記に環境変数を設定することもできます。

$ TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 swiftlint --fix

Linuxでは、SourceKitは環境変数内にある

/usr/lib/libsourcekitdInProc.so
か、環境変数によって指定されることが期待されてい
LINUX_SOURCEKIT_LIB_PATH
ます。

事前コミット

SwiftLintは、事前コミットフックとして実行できます。インストールしたら、これをリポジトリのルートのに追加し

.pre-commit-config.yaml
ます。

repos:
  - repo: https://github.com/realm/SwiftLint
    rev: 0.44.0
    hooks:
      - id: swiftlint

rev
選択したSwiftLintバージョンに調整します。

ルール

SwiftLintには200を超えるルールが含まれており、Swiftコミュニティ(つまりあなたです!)は時間の経過とともにさらに貢献し続けています。 プルリクエストをお勧めします。

更新されたルールのリストとそれらの詳細については、 こちらをご覧ください。

Source / SwiftLintFramework / 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.yml
SwiftLintを実行するディレクトリからファイルを追加して、SwiftLintを構成します。次のパラメータを設定できます。

ルールの包含:

  • disabled_rules
    :デフォルトの有効なセットからルールを無効にします。
  • opt_in_rules
    :デフォルトセットの一部ではないルールを有効にします。
  • only_rules
    :このリストで指定されたルールのみが有効になります。またはと一緒に指定することはできませ
    disabled_rules
    opt_in_rules
  • analyzer_rules
    analyze
    :これは、コマンドによってのみ実行される完全に別個のルールのリストです。すべてのアナライザールールはオプトインであるため、これが唯一の構成可能なルールリストであり、に相当するものはありません
    disabled_rules
    only_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

included: # paths to include during linting. `--path` is ignored if present.
  - Source
excluded: # paths to ignore during linting. Takes precedence over `included`.
  - Carthage
  - Pods
  - Source/ExcludedFolder
  - Source/ExcludedFile.swift
  - Source/*/ExcludedFile.swift # Exclude files with a wildcard
analyzer_rules: # Rules run by `swiftlint analyze`
  - explicit_self

# 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)

文字列で使用することにより、構成ファイルで環境変数を使用することもできます

${SOME_VARIABLE}

カスタムルールの定義

次の構文を使用して、構成ファイルでカスタム正規表現ベースのルールを定義できます。

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

出力は次のようになります。

1つ以上を指定することで一致をフィルタリングできます

match_kinds
。これにより、このリストに存在しない構文の種類を含む一致が拒否されます。考えられるすべての構文の種類は次のとおりです。

  • 口論
  • attribute.builtin
  • attribute.id
  • buildconfig.id
  • buildconfig.keyword
  • コメント
  • comment.mark
  • comment.url
  • doccomment
  • doccomment.field
  • 識別子
  • キーワード
  • 番号
  • objectliteral
  • パラメータ
  • プレースホルダー
  • ストリング
  • string_interpolation_anchor
  • タイプ識別子

カスタムルールをと組み合わせて使用​​する場合は

only_rules
、必ず 。
custom_rules
の下にアイテムとして追加して
only_rules
ください。

オートコレクト

SwiftLintは、特定の違反を自動的に修正できます。ディスク上のファイルは、修正されたバージョンで上書きされます。

実行する前に、これらのファイルのバックアップを必ず取ってください

swiftlint --fix
。そうしないと、重要なデータが失われる可能性があります。

修正の適用中にファイルを変更した後、違反(またはそのオフセット)が正しくない可能性が高いため、修正中は標準のリンティングが無効になります。

分析する

この

swiftlint analyze
コマンドは、完全なタイプチェック済みASTを使用してSwiftファイルをリントできます。クリーンビルドコマンドの呼び出し(インクリメンタルビルドは失敗します)を含むコンパイラログパスは、フラグを 介して
swiftc
渡される必要があります。例えば
analyze
--compiler-log-path
--compiler-log-path /path/to/xcodebuild.log

これは、次の方法で取得できます。

  1. DerivedDataのクリーニング(インクリメンタルビルドはanalyzeでは機能しません)
  2. ランニング
    xcodebuild -workspace {WORKSPACE}.xcworkspace -scheme {SCHEME} > xcodebuild.log
  3. ランニング
    swiftlint analyze --compiler-log-path xcodebuild.log

アナライザーのルールは、lintのルールよりもかなり遅くなる傾向があります。

複数の構成ファイルの使用

SwiftLintは、複数の構成ファイルを含めるためのさまざまな方法を提供します。複数の構成ファイルが1つの構成にマージされ、単一の構成ファイルが適用されるのと同じように適用されます。

複数の構成ファイルを使用すると役立つ可能性のあるユースケースは非常にたくさんあります。

たとえば、子構成ファイルを介して各プロジェクトでオーバーライドを許可しながら、チーム全体で共有される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が少なくとも1回正常に実行されると、キャッシュされたバージョンが存在するはずです。

remote_timeout
必要に応じて、リモート構成フェッチのタイムアウトは、 /指定子を使用して構成ファイルを介して手動で指定でき
remote_timeout_if_cached
ます。これらの値のデフォルトは2/1秒です。

コマンドライン

コマンドラインからSwiftLintを実行するときに1つの構成ファイルを提供するだけでなく、階層を渡すこともできます。最初の構成は親として扱われ、最後の構成は最も優先度の高い子として扱われます。

2つの構成ファイルだけを含む簡単な例は次のようになります。

swiftlint --config .swiftlint.yml --config .swiftlint_child.yml

ネストされた構成

メイン構成(

.swiftlint.yml
ルートフォルダー内のファイル)に加えて、名前が付けられ
.swiftlint.yml
た他の構成ファイルをディレクトリ構造に配置して、子構成としてマージできますが、同じディレクトリ内にあるファイルにのみ影響します。構成、または別の構成ファイルがないより深いディレクトリ。言い換えると、ネストされた構成は再帰的に機能しません。メイン構成に加えて、ファイルごとに最大1つのネストされた構成を適用できます。

.swiftlint.yml
ファイルは、メイン構成の構築にまだ使用されていない場合にのみ、ネストされた構成と見なされます(たとえば、などを介して参照されている場合
child_config: Folder/.swiftlint.yml
)。また、ネストされた構成の
parent_config
/
child_config
仕様は、意味がないため無視されています。

1つ(または複数)のSwiftLintファイルがパラメーターを介して明示的に指定されている場合、ディレクトリ内のどこかに

--config
他のファイルが存在するかどうかに関係なく、その構成はオーバーライドとして扱われます。したがって、ネストされた構成を使用する場合は、パラメーターを使用できません。
.swiftlint.yml
--config

ライセンス

MITライセンス。

SwiftLintは、Realm Inc.によって維持および資金提供されています。Realmの名前とロゴは、RealmInc.の商標です。

私達❤️オープンソースソフトウェア!他のオープンソースプロジェクトを参照するか、ブログを読むか、Twitter(@realm)で挨拶してください。

パフォーマンステストを実行するためのMacMiniを提供してくれたMacStadiumに感謝します。