เครื่องมือในการบังคับใช้สไตล์และการประชุมที่รวดเร็วขึ้นอยู่กับคู่มือสไตล์ GitHub Swift ที่เก็บถาวรในขณะนี้ Swiftlint บังคับใช้กฎคู่มือสไตล์ที่ชุมชน Swift ยอมรับโดยทั่วไป กฎเหล่านี้ได้รับการอธิบายอย่างดีในคู่มือสไตล์ยอดนิยมเช่นคู่มือสไตล์ Swift ของ Kodeco
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 Binaries และการพึ่งพาใน Pods/
ระหว่างการดำเนิน pod install
ครั้งต่อไปของคุณและจะช่วยให้คุณเรียกใช้ผ่าน ${PODS_ROOT}/SwiftLint/swiftlint
ในเฟสสคริปต์ของคุณ
การติดตั้งผ่าน cocoapods ยังช่วยให้สามารถตรึงไปยัง Swiftlint เวอร์ชันเฉพาะแทนที่จะเป็นเพียงแค่ล่าสุด (ซึ่งเป็นกรณีของ Homebrew)
โปรดทราบว่าสิ่งนี้จะเพิ่มไบนารี Swiftlint, ไบนารีของการพึ่งพาและการกระจายห้องสมุดไบนารีที่รวดเร็วไปยัง Pods/
DIRECTORY ดังนั้นการตรวจสอบในไดเรกทอรีนี้เพื่อ SCM เช่น GIT จะหมดกำลังใจ
mint install realm/SwiftLint
ใส่สิ่งนี้ไว้ใน MODULE.bazel
ของคุณ 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 Tool Bazel และ Swift Toolchain ล่าสุดได้รับการติดตั้งและเครื่องมือทั้งหมดสามารถค้นพบได้ใน PATH
ของคุณ
ในการสร้าง Swiftlint ให้โคลนที่เก็บนี้และเรียกใช้ make install
สำคัญ
แม้ว่ามันอาจจะดูง่ายที่จะเรียกใช้ Swiftlint ก่อนที่จะรวบรวมไฟล์ต้นฉบับ Swift เพื่อออกจากการสร้าง แต่เนิ่นๆเมื่อมีการละเมิดผ้าสำลีเป็นสิ่งสำคัญที่จะต้องเข้าใจว่า Swiftlint ได้รับการออกแบบมาเพื่อวิเคราะห์ซอร์สโค้ดที่ถูกต้องซึ่งสามารถรวบรวมได้ รหัสที่ไม่ใช่การเปรียบเทียบสามารถนำไปสู่ผลลัพธ์ที่ไม่คาดคิดและสับสนได้อย่างง่ายดายโดยเฉพาะอย่างยิ่งเมื่อดำเนินการกับ-ข้อโต้แย้งบรรทัดคำสั่ง --fix
/ --autocorrect
Swiftlint สามารถใช้เป็นปลั๊กอินเครื่องมือสร้างสำหรับทั้งโครงการแพ็คเกจ Swift และโครงการ XCode
ปลั๊กอินเครื่องมือสร้างกำหนดไดเรกทอรีการทำงานของ 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 อยู่ด้านนอกของไดเรกทอรีแพ็คเกจ/โครงการไม่ได้รับการสนับสนุนโดยตรงจากปลั๊กอินเครื่องมือสร้าง นี่เป็นเพราะมันเป็นไปไม่ได้ที่จะผ่านอาร์กิวเมนต์เพื่อสร้างปลั๊กอินเครื่องมือ (เช่นผ่านเส้นทางไฟล์ config)
หากโครงสร้างโครงการของคุณไม่ทำงานโดยตรงกับปลั๊กอินเครื่องมือสร้างโปรดพิจารณาหนึ่งในตัวเลือกต่อไปนี้:
parent_config: path/to/.swiftlint.yml
บันทึก
ขึ้นอยู่กับวิธีการติดตั้งที่ใช้ไวยากรณ์คำสั่งเชลล์ในเฟสการสร้างสคริปต์การเรียกใช้อาจแตกต่างกันหรืออาจจำเป็นต้องมีการกำหนดค่าเพิ่มเติม อ้างถึงคำแนะนำการติดตั้งสำหรับข้อมูลเพิ่มเติม
หากปลั๊กอินเครื่องมือสร้างไม่ทำงานสำหรับการตั้งค่าโครงการของคุณหรือเมื่อต้องการการตั้งค่าที่กำหนดเองเพิ่มเติม SwiftLint สามารถเพิ่มเป็นขั้นตอนการเรียกใช้สคริปต์ สิ่งนี้มีประโยชน์เมื่อการตั้งค่าโครงการขึ้นอยู่กับตัวเลือก --config
swiftlint; หรือเพื่อผ้าสำลีเป้าหมายทั้งหมดเข้าด้วยกันในการเรียกใช้ swiftlint
เพียงครั้งเดียว การรวมไฟล์และการยกเว้นสามารถกำหนดค่าในการกำหนดค่า .swiftlint.yml
ในการทำเช่นนี้ให้เพิ่มสคริปต์ที่กำหนดเองในขั้นตอน Run Script
ของ Build Phases
ของเป้าหมายแอพหลักหลังจากขั้นตอน 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 ผ่าน Cocoapods สคริปต์ควรมีลักษณะเช่นนี้:
" ${PODS_ROOT} /SwiftLint/swiftlint "
หากต้องการรวม Swiftlint เข้ากับ Visual Studio Code ให้ติดตั้งส่วนขยาย vscode-swiftlint
จากตลาด
คุณสามารถใช้การกระทำ swiftlint
อย่างเป็นทางการอย่างเป็นทางการเพื่อเรียกใช้ 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 ยังมีอยู่ในรูปแบบท่าเทียบเรือโดยใช้ Ubuntu
ดังนั้นครั้งแรกที่คุณต้องดึงอิมเมจนักเทียบท่าโดยใช้คำสั่งถัดไป:
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.
ที่นี่คุณมีเอกสารเพิ่มเติมเกี่ยวกับการใช้ภาพนักเทียบท่า
$ 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
หรือ 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}
ในทำนองเดียวกันไฟล์สามารถอ่านได้จากรายการไฟล์โดยผ่านตัวเลือก --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 เนื่องจากไม่จำเป็นต้องจัดส่งด้วยคอมไพเลอร์ที่รวดเร็วเต็มรูปแบบมันแค่สื่อสารกับอย่างเป็นทางการที่คุณติดตั้งไว้แล้วบนเครื่องของคุณ
คุณควรเรียกใช้ Swiftlint ด้วยเครื่องมือ toolchain เดียวกับที่คุณใช้เพื่อรวบรวมรหัสของคุณ
คุณอาจต้องการแทนที่ Swift Toolchain เริ่มต้นของ Swiftlint หากคุณติดตั้งเครื่องมือหรือ 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/
Subdirectory ของค่าที่ส่งผ่านในเส้นทางข้างต้น
นอกจากนี้คุณยังสามารถตั้งค่าตัวแปรสภาพแวดล้อม TOOLCHAINS
เป็นสัญลักษณ์ Reverse-DNS ที่ระบุเวอร์ชัน 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 (นั่นคือคุณ!) ยังคงมีส่วนร่วมมากขึ้นเมื่อเวลาผ่านไป สนับสนุนคำขอดึง
คุณสามารถค้นหารายการกฎที่อัปเดตและข้อมูลเพิ่มเติมเกี่ยวกับพวกเขาได้ที่นี่
นอกจากนี้คุณยังสามารถตรวจสอบไดเรกทอรี/SwiftlintBuiltInrules/กฎเพื่อดูการใช้งานของพวกเขา
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 จะเห็นความคิดเห็นเปิดใช้งานการจับคู่:
// 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
จะเปิดใช้งานการเลือกใช้กฎทั้งหมดยกเว้นตัวระบุในรายการใน 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 ดังนั้นพวกเขาจึงรวดเร็วแม่นยำสามารถใช้ประโยชน์จาก 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
นี่คือสิ่งที่ผลลัพธ์จะเป็นเช่น:
เป็นสิ่งสำคัญที่จะต้องทราบว่ารูปแบบการแสดงออกปกติใช้กับการเปิดใช้งาน Flags s
และ m
นั่น .
ตรงกับ newLines และ ^
/ $
ตรงกับการเริ่มต้นและจุดสิ้นสุดของบรรทัดตามลำดับ หาก .
ไม่ต้องการมี จับคู่ newLines ตัวอย่างเช่น regex สามารถเตรียมล่วงหน้าได้โดย (?-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 สามารถสกัดได้เพื่อขอ 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 คุณสามารถใช้ Builds Swiftlint อย่างเป็นทางการ (เช่นจาก Homebrew) เพื่อเรียกใช้กฎที่กำหนดเอง Regex
Swiftlint สามารถแก้ไขการละเมิดบางอย่างโดยอัตโนมัติ ไฟล์บนดิสก์ถูกเขียนทับด้วยเวอร์ชันที่แก้ไขแล้ว
โปรดตรวจสอบให้แน่ใจว่ามีการสำรองข้อมูลของไฟล์เหล่านี้ก่อนที่จะเรียกใช้ swiftlint --fix
มิฉะนั้นข้อมูลสำคัญอาจหายไป
ผ้าสำลีมาตรฐานถูกปิดใช้งานขณะแก้ไขเนื่องจากความเป็นไปได้สูงของการละเมิด (หรือออฟเซ็ตของพวกเขา) ไม่ถูกต้องหลังจากแก้ไขไฟล์ในขณะที่ใช้การแก้ไข
คำสั่ง swiftlint analyze
สามารถ lint Swift ได้โดยใช้ AST ที่ตรวจสอบประเภทเต็ม พา ธ บันทึกคอมไพเลอร์ที่มีการเรียกใช้คำสั่ง clean 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 เพื่อทำการทดสอบประสิทธิภาพของเรา