Alat untuk menegakkan gaya dan konvensi Swift, secara longgar berdasarkan panduan gaya GitHub Swift yang sekarang diarsipkan. Swiftlint menegakkan aturan panduan gaya yang umumnya diterima oleh komunitas Swift. Aturan -aturan ini dijelaskan dengan baik dalam panduan gaya populer seperti Panduan Gaya Swift Kodeco.
Swiftlint mengaitkan ke Clang dan SourceKit untuk menggunakan representasi AST dari file sumber Anda untuk hasil yang lebih akurat.
SwiftLint dapat digunakan sebagai plugin perintah atau plugin alat build.
Menambahkan
. package ( url : " https://github.com/SimplyDanny/SwiftLintPlugins " , from : " <version> " )
ke file Package.swift
Anda untuk mengkonsumsi rilis terbaru dari SwiftLint secara otomatis atau menjepit ketergantungan ke versi tertentu:
. package ( url : " https://github.com/SimplyDanny/SwiftLintPlugins " , exact : " <version> " )
Di dalamnya, ganti <version>
dengan versi minimum atau tepat yang diinginkan.
Catatan
Mengkonsumsi plugin langsung dari repositori SwiftLint hadir dengan beberapa kelemahan. Untuk menghindarinya dan mengurangi overhead yang dikenakan, sangat disarankan untuk mengonsumsi plugin dari repositori Swiftlintplugins khusus, meskipun plugin dari repositori SwiftLint juga benar -benar fungsional. Jika plugin dari SwiftLint lebih disukai, cukup gunakan URL https://github.com/realm/SwiftLint
dalam deklarasi paket di atas.
Namun, Swiftlintplugins memfasilitasi adopsi plugin secara besar -besaran. Ini mencantumkan beberapa alasan yang menggerakkan plugin seperti yang disediakan oleh Swiftlint sendiri sangat merepotkan. Karena kode plugin dan rilis disinkronkan, tidak ada perbedaan fungsionalitas antara keduanya, tetapi Anda menghabiskan banyak waktu dan kesulitan menggunakan repositori plugin khusus.
Dokumen ini mengasumsikan Anda mengandalkan Swiftlintplugins.
Gunakan tautan berikut untuk menambahkan SwiftLint sebagai ketergantungan paket ke proyek Xcode:
https://github.com/SimplyDanny/SwiftLintPlugins
brew install swiftlint
Tambahkan yang berikut ke Podfile
Anda:
pod 'SwiftLint'
Ini akan mengunduh Binari dan Ketergantungan SwiftLint di Pods/
Selama Eksekusi pod install
Anda berikutnya dan akan memungkinkan Anda untuk memohon melalui ${PODS_ROOT}/SwiftLint/swiftlint
dalam fase Build Script Anda.
Menginstal melalui cocoapods juga memungkinkan penyepitan ke versi tertentu dari SwiftLint daripada sekadar yang terbaru (yang merupakan kasus dengan homebrew).
Perhatikan bahwa ini akan menambahkan binari Swiftlint, binari dependensi, dan distribusi perpustakaan biner Swift ke Pods/
direktori, jadi memeriksa direktori ini ke SCM seperti git tidak dianjurkan.
mint install realm/SwiftLint
Masukkan ini di MODULE.bazel
Anda. Bazel:
bazel_dep ( name = "swiftlint" , version = "0.52.4" , repo_name = "SwiftLint" )
Atau letakkan ini di WORKSPACE
Anda:
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 ()
Kemudian Anda dapat menjalankan SwiftLint di direktori saat ini dengan perintah ini:
bazel run -c opt @SwiftLint//:swiftlint
Unduh SwiftLint.pkg
dari rilis GitHub terbaru dan jalankan.
Pastikan Bazel Build Tool dan swift toolchain baru -baru ini diinstal dan semua alat dapat ditemukan di PATH
Anda.
Untuk membangun SwiftLint, klon repositori ini dan jalankan make install
.
Penting
Meskipun mungkin tampak intuitif untuk menjalankan Swiftlint sebelum menyusun file sumber Swift untuk keluar dari build lebih awal ketika ada pelanggaran serat, penting untuk memahami bahwa SwiftLint dirancang untuk menganalisis kode sumber yang valid yang dapat dikompilasi. Kode non-kompilasi dapat dengan mudah mengarah pada hasil yang tidak terduga dan membingungkan, terutama ketika dieksekusi dengan --fix
/ --autocorrect
.
SwiftLint dapat digunakan sebagai plugin alat build untuk proyek paket Swift dan proyek XCODE.
Plugin Build Tool menentukan direktori kerja SwiftLint dengan menemukan file konfigurasi paling atas dalam direktori paket/proyek. Jika file konfigurasi tidak ditemukan di dalamnya, direktori paket/proyek digunakan sebagai direktori kerja.
Plugin melakukan kesalahan ketika tidak dapat menyelesaikan direktori kerja SwiftLint. Misalnya, ini akan terjadi dalam proyek Xcode di mana file Swift target tidak berada di dalam direktori proyek.
Untuk memaksimalkan kompatibilitas dengan plugin, hindari struktur proyek yang memerlukan penggunaan opsi --config
.
Catatan
Membutuhkan pemasangan melalui SWIFT Package Manager.
Bangun plugin alat berjalan saat membangun setiap target. Ketika suatu proyek memiliki beberapa target, plugin harus ditambahkan ke target yang diinginkan secara individual.
Untuk melakukan ini, tambahkan plugin ke target untuk dilapisi sebagai berikut:
. target (
...
plugins : [ . plugin ( name : " SwiftLintBuildToolPlugin " , package : " SwiftLintPlugins " ) ]
) ,
Catatan
Membutuhkan pemasangan melalui SWIFT Package Manager.
Plugin perintah memungkinkan menjalankan SwiftLint dari baris perintah sebagai berikut:
swift package plugin swiftlint
Catatan
Membutuhkan penginstalan melalui ketergantungan paket Xcode.
Bangun plugin alat berjalan sebagai fase build dari setiap target. Ketika suatu proyek memiliki beberapa target, plugin harus ditambahkan ke target yang diinginkan secara individual.
Untuk melakukan ini, tambahkan SwiftLintBuildToolPlugin
ke fase Run Build Tool Plug-ins
fase Build Phases
untuk target yang akan dibuang.
Tip
Saat menggunakan plugin untuk pertama kalinya, pastikan untuk mempercayai dan mengaktifkannya saat diminta. Jika ada makro membangun peringatan, pilihlah untuk mempercayai dan mengaktifkan makro juga.
Untuk penggunaan tanpa pengawasan (misalnya CI), plugin paket dan validasi makro dapat dinonaktifkan dengan salah satu dari yang berikut:
Menggunakan Opsi xcodebuild
:
-skipPackagePluginValidation
-skipMacroValidation
Mengatur XCode Defaults:
defaults write com.apple.dt.Xcode IDESkipPackagePluginFingerprintValidatation -bool YES
defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES
Penting
Opsi penggunaan tanpa pengawasan bypass dialog validasi Xcode dan secara implisit mempercayai semua plugin dan makro, yang memiliki implikasi keamanan.
Struktur proyek di mana file konfigurasi SwiftLint terletak di luar direktori paket/proyek tidak secara langsung didukung oleh plugin alat build. Ini karena tidak mungkin untuk melewati argumen untuk membangun plugin alat (misalnya, melewati jalur file config).
Jika struktur proyek Anda tidak berfungsi secara langsung dengan plugin Build Tool, silakan pertimbangkan salah satu opsi berikut:
parent_config: path/to/.swiftlint.yml
.Catatan
Berdasarkan metode instalasi yang digunakan, sintaks perintah shell dalam fase run script build mungkin berbeda atau konfigurasi tambahan bisa diperlukan. Lihat instruksi instalasi untuk informasi lebih lanjut.
Jika plugin Build Tool tidak berfungsi untuk pengaturan proyek Anda atau saat pengaturan khusus tambahan diperlukan, SwiftLint dapat ditambahkan sebagai fase pembuatan skrip Run. Ini berguna ketika pengaturan proyek bergantung pada opsi --config
Swiftlint; atau untuk memasukkan semua target bersama dalam satu doa swiftlint
. Inklusi dan pengecualian file dapat dikonfigurasi dalam konfigurasi .swiftlint.yml
.
Untuk melakukan ini, tambahkan skrip khusus ke fase Run Script
dari Build Phases
dari target aplikasi primer, setelah fase Compile Sources
. Gunakan implementasi skrip berikut:
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
Jika Anda menggunakan SwiftLintPlugin dalam paket Swift, Anda dapat merujuk ke swiftlint
yang dapat dieksekusi dengan cara berikut:
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
Catatan
Jalur SWIFTLINT_CMD
menggunakan konfigurasi Xcode default dan telah diuji pada XCODE 15/16. Dalam hal konfigurasi lain (misalnya jalur paket Swift khusus), harap beradaptasi dengan nilainya.
Tip
Hapus centang Based on dependency analysis
untuk menjalankan swiftlint
pada semua bangunan tambahan, menekan peringatan output yang tidak ditentukan.
Xcode 15 membuat perubahan yang signifikan dengan mengatur nilai default dari pengaturan build ENABLE_USER_SCRIPT_SANDBOXING
dari NO
ke YES
. Akibatnya, SwiftLint menemukan kesalahan terkait dengan izin file yang hilang, yang biasanya bermanifestasi sebagai error: Sandbox: swiftlint(19427) deny(1) file-read-data.
Untuk menyelesaikan masalah ini, perlu secara manual mengatur pengaturan ENABLE_USER_SCRIPT_SANDBOXING
ke NO
untuk target spesifik yang dikonfigurasi oleh SwiftLint.
Jika Anda memasang SwiftLint melalui Homebrew on Apple Silicon, Anda mungkin mengalami peringatan ini:
warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint
Itu karena homebrew di apel silikon memasang binari ke folder /opt/homebrew/bin
secara default. Untuk menginstruksikan xcode di mana menemukan SwiftLint, Anda dapat menambahkan /opt/homebrew/bin
ke variabel lingkungan PATH
dalam fase build Anda:
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
Atau Anda dapat membuat tautan simbolis di /usr/local/bin
menunjuk ke biner yang sebenarnya:
ln -s /opt/homebrew/bin/swiftlint /usr/local/bin/swiftlint
Jika Anda ingin memperbaiki pelanggaran juga, skrip Anda dapat menjalankan swiftlint --fix && swiftlint
bukan hanya swiftlint
. Ini berarti bahwa semua pelanggaran yang dapat diperbaiki ditetapkan sambil memastikan peringatan muncul di proyek Anda untuk sisa pelanggaran.
Jika Anda telah menginstal SwiftLint melalui Cocoapods, skrip akan terlihat seperti ini:
" ${PODS_ROOT} /SwiftLint/swiftlint "
Untuk mengintegrasikan SwiftLint dengan kode Visual Studio, instal ekstensi vscode-swiftlint
dari pasar.
Anda dapat menggunakan aksi fastlane swiftlint
resmi untuk menjalankan Swiftlint sebagai bagian dari proses Fastlane Anda.
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 juga tersedia sebagai gambar Docker menggunakan Ubuntu
. Jadi baru pertama kali Anda perlu menarik gambar Docker menggunakan perintah berikutnya:
docker pull ghcr.io/realm/swiftlint:latest
Kemudian berikutnya, Anda hanya menjalankan swiftlint
di dalam Docker seperti:
docker run -it -v ` pwd ` : ` pwd ` -w ` pwd ` ghcr.io/realm/swiftlint:latest
Ini akan menjalankan swiftlint
di folder tempat Anda berada sekarang ( pwd
), menunjukkan output seperti:
$ 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.
Di sini Anda memiliki lebih banyak dokumentasi tentang penggunaan gambar 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.
Jalankan swiftlint
di direktori yang berisi file Swift ke Lint. Direktori akan dicari secara rekursif.
Untuk menentukan daftar file saat menggunakan lint
atau analyze
(seperti daftar file yang dimodifikasi oleh Xcode yang ditentukan oleh plugin ExtraBuildPhase
Xcode, atau file yang dimodifikasi di pohon yang berfungsi berdasarkan git ls-files -m
), Anda dapat melakukannya dengan meneruskan Opsi --use-script-input-files
dan mengatur variabel instance berikut: SCRIPT_INPUT_FILE_COUNT
dan SCRIPT_INPUT_FILE_0
, SCRIPT_INPUT_FILE_1
, ..., SCRIPT_INPUT_FILE_{SCRIPT_INPUT_FILE_COUNT - 1}
. Demikian pula, file dapat dibaca dari daftar file dengan menyerahkan opsi --use-script-input-file-lists
dan mengatur variabel instance berikut: SCRIPT_INPUT_FILE_LIST_COUNT
dan SCRIPT_INPUT_FILE_LIST_0
, SCRIPT_INPUT_FILE_LIST_1
, ..., SCRIPT_INPUT_FILE_LIST_{SCRIPT_INPUT_FILE_LIST_COUNT - 1}
Ini adalah variabel lingkungan yang sama yang ditetapkan untuk file input ke fase skrip xcode khusus.
Swiftlint mengaitkan ke SourceKit sehingga terus bekerja bahkan ketika Swift berevolusi!
Ini juga membuat Swiftlint ramping, karena tidak perlu dikirimkan dengan kompiler Swift penuh, itu hanya berkomunikasi dengan yang resmi yang sudah Anda instal di mesin Anda.
Anda harus selalu menjalankan SwiftLint dengan toolchain yang sama yang Anda gunakan untuk mengkompilasi kode Anda.
Anda mungkin ingin mengganti swift toolchain default Swiftlint jika Anda memiliki beberapa toolchain atau xcodes yang diinstal.
Inilah urutan di mana SwiftLint menentukan alat berat Swift yang akan digunakan:
$XCODE_DEFAULT_TOOLCHAIN_OVERRIDE
$TOOLCHAIN_DIR
atau $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
diharapkan ditemukan di usr/lib/
subdirektori dari nilai yang dilewati di jalur di atas.
Anda juga dapat mengatur variabel lingkungan TOOLCHAINS
ke notasi Reverse-DNS yang mengidentifikasi versi toolchain Swift:
TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 swiftlint --fix
Di Linux, SourceKit diharapkan berada di /usr/lib/libsourcekitdInProc.so
atau ditentukan oleh variabel lingkungan LINUX_SOURCEKIT_LIB_PATH
.
pre-commit
Swiftlint dapat dijalankan sebagai kait pra-komit. Setelah diinstal, tambahkan ini ke .pre-commit-config.yaml
di akar repositori Anda:
repos :
- repo : https://github.com/realm/SwiftLint
rev : 0.50.3
hooks :
- id : swiftlint
Sesuaikan rev
ke versi SwiftLint pilihan Anda. pre-commit autoupdate
dapat digunakan untuk memperbarui ke versi saat ini.
SwiftLint dapat dikonfigurasi menggunakan entry
untuk menerapkan perbaikan dan gagal pada kesalahan:
- repo : https://github.com/realm/SwiftLint
rev : 0.50.3
hooks :
- id : swiftlint
entry : swiftlint --fix --strict
Lebih dari 200 aturan termasuk dalam SwiftLint dan komunitas Swift (itu Anda!) Terus berkontribusi lebih banyak dari waktu ke waktu. Permintaan tarik didorong.
Anda dapat menemukan daftar aturan yang diperbarui dan informasi lebih lanjut tentang mereka di sini.
Anda juga dapat memeriksa direktori sumber/swiftlintbuiltinrules/aturan untuk melihat implementasinya.
opt_in_rules
dinonaktifkan secara default (yaitu, Anda harus secara eksplisit mengaktifkannya di file konfigurasi Anda).
Pedoman kapan harus menandai aturan sebagai opt-in:
empty_count
)force_unwrapping
)Aturan dapat dinonaktifkan dengan komentar di dalam file sumber dengan format berikut:
// swiftlint:disable <rule1> [<rule2> <rule3>...]
Aturan akan dinonaktifkan sampai akhir file atau sampai linter melihat komentar yang cocok dengan:
// swiftlint:enable <rule1> [<rule2> <rule3>...]
Misalnya:
// 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
Termasuk all
kata kunci akan menonaktifkan semua aturan sampai linter melihat komentar yang sesuai dengan:
// swiftlint:disable all
// swiftlint:enable all
Misalnya:
// 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
Dimungkinkan juga untuk memodifikasi perintah disable
atau enable
dengan menambahkan :previous
, :this
atau :next
hanya untuk menerapkan perintah ke yang sebelumnya, ini (saat ini) atau baris berikutnya masing -masing.
Misalnya:
// 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
Jalankan swiftlint rules
untuk mencetak daftar semua aturan yang tersedia dan pengidentifikasi mereka.
Konfigurasikan SwiftLint dengan menambahkan file .swiftlint.yml
dari direktori Anda akan menjalankan SwiftLint dari. Parameter berikut dapat dikonfigurasi:
Inklusi aturan:
disabled_rules
: Nonaktifkan aturan dari set yang diaktifkan default.opt_in_rules
: Mengaktifkan aturan yang bukan bagian dari set default. Pengidentifikasi khusus all
akan memungkinkan semua aturan memilih dalam linter, kecuali yang tercantum dalam disabled_rules
.only_rules
: Hanya aturan yang ditentukan dalam daftar ini yang akan diaktifkan. Tidak dapat ditentukan bersama disabled_rules
atau opt_in_rules
.analyzer_rules
: Ini adalah daftar aturan yang sepenuhnya terpisah yang hanya dijalankan oleh perintah analyze
. Semua aturan penganalisa adalah opt-in, jadi ini adalah satu-satunya daftar aturan yang dapat dikonfigurasi, tidak ada yang setara untuk disabled_rules
dan only_rules
. all
pengidentifikasi khusus juga dapat digunakan di sini untuk mengaktifkan semua aturan penganalisa, kecuali yang tercantum dalam 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)
Anda juga dapat menggunakan variabel lingkungan dalam file konfigurasi Anda, dengan menggunakan ${SOME_VARIABLE}
dalam string.
Selain aturan yang dikirimkan oleh proyek SwiftLint utama, SwiftLint juga dapat menjalankan dua jenis aturan khusus yang dapat Anda definisikan dalam proyek Anda sendiri:
Aturan-aturan ini ditulis dengan cara yang sama seperti aturan berbasis Swift yang dikirimkan dengan SwiftLint sehingga cepat, akurat, dapat memanfaatkan Swiftsyntax, dapat diuji unit, dan banyak lagi.
Menggunakan ini membutuhkan pembangunan Swiftlint dengan Bazel seperti yang dijelaskan dalam video ini atau kode terkait di github.com/jpsim/swiftlint-bazel-example.
Anda dapat mendefinisikan aturan berbasis Regex khusus di file konfigurasi Anda menggunakan sintaks berikut:
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
Seperti inilah keluarannya:
Penting untuk dicatat bahwa pola ekspresi reguler digunakan dengan s
dan m
diaktifkan, yaitu .
cocok dengan newlines dan ^
/ $
cocok dengan awal dan akhir baris, masing -masing. Jika Anda tidak ingin memilikinya .
Cocokkan Newline, misalnya, Regex dapat disiapkan oleh (?-s)
.
Anda dapat memfilter kecocokan dengan menyediakan satu atau lebih match_kinds
, yang akan menolak kecocokan yang mencakup jenis sintaks yang tidak ada dalam daftar ini. Berikut semua jenis sintaks yang mungkin:
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
Semua jenis sintaks yang digunakan dalam cuplikan kode Swift dapat diekstraksi meminta SourceKitten. Misalnya, sourcekitten syntax --text "struct S {}"
memberikan
source.lang.swift.syntaxtype.keyword
untuk kata kunci struct
dansource.lang.swift.syntaxtype.identifier
untuk namanya S
yang cocok dengan keyword
dan identifier
dalam daftar di atas.
Jika menggunakan aturan khusus dalam kombinasi dengan only_rules
, Anda harus menyertakan string literal custom_rules
dalam daftar only_rules
:
only_rules :
- custom_rules
custom_rules :
no_hiding_in_strings :
regex : " ([nN]inja) "
match_kinds : string
Tidak seperti aturan kustom Swift, Anda dapat menggunakan SwiftLint Build resmi (misalnya dari Homebrew) untuk menjalankan aturan khusus Regex.
SwiftLint dapat secara otomatis memperbaiki pelanggaran tertentu. File pada disk ditimpa dengan versi yang dikoreksi.
Pastikan untuk memiliki cadangan file -file ini sebelum menjalankan swiftlint --fix
, jika tidak data penting mungkin hilang.
Linting standar dinonaktifkan saat mengoreksi karena kemungkinan besar pelanggaran (atau offset mereka) tidak benar setelah memodifikasi file saat menerapkan koreksi.
Perintah swiftlint analyze
dapat meletakkan file Swift menggunakan AST yang diperiksa tipe penuh. Jalur log kompiler yang berisi doa perintah pembuatan swiftc
bersih (build tambahan akan gagal) harus diteruskan untuk analyze
melalui bendera --compiler-log-path
. misalnya --compiler-log-path /path/to/xcodebuild.log
Ini bisa diperoleh dengan
xcodebuild -workspace {WORKSPACE}.xcworkspace -scheme {SCHEME} > xcodebuild.log
swiftlint analyze --compiler-log-path xcodebuild.log
Aturan penganalisa cenderung jauh lebih lambat daripada aturan serat.
SwiftLint menawarkan berbagai cara untuk memasukkan beberapa file konfigurasi. Beberapa file konfigurasi digabungkan menjadi satu konfigurasi tunggal yang kemudian diterapkan seperti halnya file konfigurasi tunggal akan diterapkan.
Ada cukup banyak kasus penggunaan di mana menggunakan beberapa file konfigurasi dapat membantu:
Misalnya, seseorang dapat menggunakan konfigurasi SwiftLint bersama tim-seluruh dengan memungkinkan overrides di setiap proyek melalui file konfigurasi anak.
Konfigurasi Selebar Tim:
disabled_rules :
- force_cast
Konfigurasi khusus proyek:
opt_in_rules :
- force_cast
Anda dapat menentukan referensi child_config
dan/atau parent_config
dalam file konfigurasi. Referensi ini harus berupa jalur lokal relatif terhadap folder file konfigurasi yang ditentukan. Ini bahkan berfungsi secara rekursif, selama tidak ada siklus dan tidak ada ambiguitas.
Konfigurasi anak diperlakukan sebagai penyempurnaan dan dengan demikian memiliki prioritas yang lebih tinggi , sedangkan konfigurasi induk dianggap sebagai basis dengan prioritas yang lebih rendah jika terjadi konflik.
Inilah contohnya, dengan asumsi Anda memiliki struktur file berikut:
ProjectRoot
|_ .swiftlint.yml
|_ .swiftlint_refinement.yml
|_ Base
|_ .swiftlint_base.yml
Untuk memasukkan penyempurnaan dan file dasar, .swiftlint.yml
Anda akan terlihat seperti ini:
child_config : .swiftlint_refinement.yml
parent_config : Base/.swiftlint_base.yml
Saat menggabungkan konfigurasi orang tua dan anak, included
dan excluded
konfigurasi diproses dengan hati -hati untuk memperhitungkan perbedaan di lokasi direktori file konfigurasi yang berisi.
Sama seperti Anda dapat memberikan referensi child_config
/ parent_config
lokal, alih -alih merujuk jalur lokal, Anda bisa menempatkan URL yang mengarah ke file konfigurasi. Agar SwiftLint untuk mendeteksi referensi jarak jauh ini, mereka harus mulai dengan http://
atau https://
.
File konfigurasi jarak jauh yang direferensikan bahkan dapat secara rekursif merujuk file konfigurasi jarak jauh lainnya, tetapi tidak diizinkan untuk memasukkan referensi lokal.
Menggunakan referensi jarak jauh, .swiftlint.yml
Anda bisa terlihat seperti ini:
parent_config : https://myteamserver.com/our-base-swiftlint-config.yml
Setiap kali Anda menjalankan SwiftLint dan memiliki koneksi internet, SwiftLint mencoba untuk mendapatkan versi baru dari setiap konfigurasi jarak jauh yang dirujuk. Jika permintaan ini keluar, versi yang di -cache digunakan jika tersedia. Jika tidak ada versi cache yang tersedia, SwiftLint gagal - tetapi jangan khawatir, versi yang di -cache harus ada di sana begitu Swiftlint telah berjalan dengan sukses setidaknya sekali.
Jika diperlukan, batas waktu untuk pengambilan konfigurasi jarak jauh dapat ditentukan secara manual melalui file konfigurasi menggunakan spesifikasi remote_timeout
/ remote_timeout_if_cached
. Nilai -nilai ini default masing -masing untuk 2 detik atau 1 detik.
Alih-alih hanya menyediakan satu file konfigurasi saat menjalankan SwiftLint melalui baris perintah, Anda juga dapat melewati hierarki, di mana konfigurasi pertama diperlakukan sebagai orang tua, sedangkan yang terakhir diperlakukan sebagai anak prioritas tertinggi.
Contoh sederhana termasuk hanya dua file konfigurasi terlihat seperti ini:
swiftlint --config .swiftlint.yml --config .swiftlint_child.yml
Selain konfigurasi utama (file .swiftlint.yml
di folder root), Anda dapat meletakkan file konfigurasi lain bernama .swiftlint.yml
ke dalam struktur direktori yang kemudian digabungkan sebagai konfigurasi anak, tetapi hanya dengan efek untuk mereka File yang berada dalam direktori yang sama dengan konfigurasi atau di direktori yang lebih dalam di mana tidak ada file konfigurasi lain. Dengan kata lain: Konfigurasi bersarang tidak berfungsi secara rekursif - ada jumlah maksimum satu konfigurasi bersarang per file yang dapat diterapkan sebagai tambahan untuk konfigurasi utama.
File .swiftlint.yml
hanya dianggap sebagai konfigurasi bersarang jika belum digunakan untuk membangun konfigurasi utama (misalnya dengan direferensikan melalui sesuatu seperti child_config: Folder/.swiftlint.yml
). Juga, spesifikasi parent_config
/ child_config
dari konfigurasi bersarang diabaikan karena tidak ada gunanya.
Jika satu (atau lebih) file Swiftlint secara eksplisit ditentukan melalui parameter --config
, konfigurasi itu akan diperlakukan sebagai override, tidak peduli apakah ada file .swiftlint.yml
lainnya di suatu tempat di dalam direktori. Jadi, jika Anda ingin menggunakan konfigurasi bersarang, Anda tidak dapat menggunakan parameter --config
.
MIT berlisensi.
SwiftLint dipertahankan dan didanai oleh Realm Inc. Nama -nama dan logo untuk ranah adalah merek dagang dari Realm Inc.
Kami ❤️ Perangkat lunak open source! Lihat proyek open source kami yang lain, baca blog kami, atau katakan di Twitter (@Realm).
Terima kasih kami kepada MacStadium karena menyediakan Mac Mini untuk menjalankan tes kinerja kami.