أداة لفرض الأسلوب السريع والاتفاقيات ، بشكل فضفاض بناءً على دليل أسلوب 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
في مراحل بناء البرنامج النصي.
يتيح التثبيت عبر CocoApods أيضًا التعلق بإصدار معين من 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 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 خارج دليل الحزمة/المشروع لا يتم دعمه مباشرة بواسطة المكون الإضافي للأداة. هذا لأنه لا يمكن تمرير الوسائط إلى إنشاء مكونات إضافية للأدوات (على سبيل المثال ، تمرير مسار ملف التكوين).
إذا كان بنية المشروع الخاصة بك لا تعمل مباشرة مع المكون الإضافي للأداة ، فيرجى مراعاة أحد الخيارات التالية:
parent_config: path/to/.swiftlint.yml
.ملحوظة
استنادًا إلى طريقة التثبيت المستخدمة ، قد يكون بناء جملة أمر shell في مرحلة بناء البرنامج النصي Run مختلفًا أو قد يكون هناك حاجة إلى تكوين إضافي. ارجع إلى تعليمات التثبيت لمزيد من المعلومات.
إذا لم يعمل المكون الإضافي لأداة Build Tool لإعداد المشروع الخاص بك أو عند الحاجة إلى إعداد مخصص إضافي ، فيمكن إضافة SwiftLint كمرحلة بناء نصية. يكون هذا مفيدًا عندما يعتمد إعداد المشروع على خيار SwiftLint --config
؛ أو للترسيخ جميع الأهداف معا في احتجاج 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 في حزمة سريعة ، فيمكنك الرجوع إلى 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 على Silicon Apple يقوم بتثبيت الثنائيات في مجلد /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 ، قم بتثبيت ملحق 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 مثل:
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
أو analyze
(مثل قائمة الملفات المعدلة بواسطة XCODE المحدد بواسطة المكون الإضافي لـ ExtraBuildPhase
XCODE ، أو الملفات المعدلة في شجرة العمل استنادًا إلى git ls-files -m
) ، يمكنك القيام بذلك عن طريق تمرير الخيار --use-script-input-files
وإعداد متغيرات المثيل التالية: SCRIPT_INPUT_FILE_COUNT
و SCRIPT_INPUT_FILE_0
، SCRIPT_INPUT_FILE_1
، ... ، SCRIPT_INPUT_FILE_{SCRIPT_INPUT_FILE_COUNT - 1}
. وبالمثل ، يمكن قراءة الملفات من قوائم الملفات عن طريق تمرير اختلاف الخيار --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 مع نفس مجموعة الأدوات التي تستخدمها لتجميع الكود الخاص بك.
قد ترغب في تجاوز مجموعة الأدوات السريعة الافتراضية لـ SwiftLint إذا كان لديك عدة أدوات أو Xcodes مثبتة.
إليك الترتيب الذي يحدد به 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
على تدوين DNS العكسي الذي يحدد إصدارًا سريعًا لأدوات الأدوات:
TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 swiftlint --fix
على Linux ، من المتوقع أن يكون SourceKit موجودًا في /usr/lib/libsourcekitdInProc.so
أو المحدد بواسطة متغير بيئة LINUX_SOURCEKIT_LIB_PATH
.
pre-commit
يمكن تشغيل swiftlint كخطاف قبل الالتزام. بمجرد التثبيت ، أضف هذا إلى .pre-commit-config.yaml
في جذر مستودعك:
repos :
- repo : https://github.com/realm/SwiftLint
rev : 0.50.3
hooks :
- id : swiftlint
اضبط 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 (هذا أنت!) في المساهمة أكثر بمرور الوقت. يتم تشجيع طلبات السحب.
يمكنك العثور على قائمة محدثة من القواعد ومزيد من المعلومات عنها هنا.
يمكنك أيضًا التحقق من دليل المصدر/SwiftLintBuiltIltinRules/Rules لمعرفة تنفيذها.
يتم تعطيل 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
من الدليل الذي ستقوم بتشغيله من. يمكن تكوين المعلمات التالية:
إدراج القاعدة:
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
، أي .
تطابق الخطوط الجديدة و ^
/ $
تطابق بداية ونهاية الخطوط ، على التوالي. إذا كنت لا تريد ذلك .
تطابق الخطوط الجديدة ، على سبيل المثال ، يمكن إعداد 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
يمكن استخراج جميع أنواع بناء الجملة المستخدمة في مقتطف من الكود السريع وهو يسأل 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
على عكس القواعد المخصصة السريعة ، يمكنك استخدام SwiftLint Builds الرسمية (على سبيل المثال من Homebrew) لتشغيل قواعد مخصصة Regex.
يمكن لـ SwiftLint تصحيح بعض الانتهاكات. يتم كتابة الملفات على القرص مع نسخة مصححة.
يرجى التأكد من الحصول على نسخ احتياطية لهذه الملفات قبل تشغيل swiftlint --fix
، قد تضيع البيانات المهمة.
يتم تعطيل Linting القياسي أثناء التصحيح بسبب احتمال الانتهاكات (أو إزاحةها) غير صحيحة بعد تعديل ملف أثناء تطبيق التصحيحات.
يمكن لأمر swiftlint analyze
ترتبات الملفات السريعة باستخدام AST الكامل الذي تم فحصه. يجب أن يتم تمرير مسار سجل المترجم الذي يحتوي على استدعاء أمر swiftc
Clean 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 ثانية أو ثانية واحدة ، على التوالي.
بدلاً من مجرد توفير ملف تكوين واحد عند تشغيل 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
.
معهد ماساتشوستس للتكنولوجيا مرخصة.
يتم الاحتفاظ بـ Swiftlint وتمويلها من قبل Realm Inc. أسماء وشعارات العالم هي علامات تجارية لشركة Realm Inc.
نحن ❤ Open Source Software! شاهد مشاريعنا الأخرى مفتوحة المصدر ، أو اقرأ مدونتنا ، أو قل مرحبًا على Twitter (realm).
شكرنا لماكستاديوم لتوفير Mac Mini لإجراء اختبارات أدائنا.