سريع ، قابل للتكوين ، قابلية التوسيع ، مرنة ، وجميلة ل GO. استبدال Golint. يوفر Revive إطارًا لتطوير القواعد المخصصة ، ويتيح لك تحديد إعداد مسبق صارم لتعزيز عمليات مراجعة التطوير والرمز .
var-namingrevive كمكتبةgo install github.com/mgechev/revive@latestأو الحصول على تنفيذ قابلة للتنفيذ من صفحة الإصدارات.
يمكنك تثبيت الفرع الرئيسي (بما في ذلك الالتزام الأخير) مع:
go install github.com/mgechev/revive@master نظرًا لأن السلوك الافتراضي revive متوافق مع golint ، دون توفير أي أعلام إضافية ، فإن الفرق الوحيد الذي تلاحظه هو التنفيذ بشكل أسرع.
يدعم revive علامة -config التي يجب أن تتوافق قيمتها مع ملف TOML الذي يصف القواعد التي يجب استخدامها لتصنيع revive . إذا لم يتم توفيره ، فسيحاول revive استخدام ملف تكوين عالمي (يُفترض أنه موجود في $HOME/revive.toml ). خلاف ذلك ، إذا لم يتم العثور على ملف TOML للتكوين ، فإن revive يستخدم مجموعة مدمجة من قواعد Linting الافتراضية.
يجب تركيب حجم لمشاركة المستودع الحالي مع الحاوية. يرجى الرجوع إلى وثائق Docker Mounts
docker run -v " $( pwd ) " :/var/ < repository > ghcr.io/mgechev/revive:v1.3.7 -config /var/ < repository > /revive.toml -formatter stylish ./var/kidle/...-v هو المجلدghcr.io/mgechev/revive:v1.3.7 هو اسم الصورة ونسخه يتوافق مع أمر reviveإذا كنت ترغب في استخدام Revive مع Bazel ، فابحث عن القواعد التي يحتفظ بها Atlassian.
دعم VSCODE في VSCODE-GO.
دعم Goland عبر مراقبي الملفات.
دعم ATOM عبر Linter-Revive.
دعم VIM عبر التحليل الكثيف/ALE.
let g: ale_linters = {
' go ' : [ ' revive ' ],
}دعم Neovim عبر null-ls.nvim.
require ( " null-ls " ). setup ({
sources = {
require ( " null-ls " ). builtins . diagnostics . revive
},
})CODEAC.IO - تتكامل خدمة مراجعة التعليمات البرمجية الآلية مع GitHub و Bitbucket و Gitlab (حتى مستضاف ذاتي) وتساعدك على محاربة الديون الفنية. تحقق من عمليات السحب الخاصة بك مع Revive تلقائيًا. (مجاني للمشاريع مفتوحة المصدر)
لتمكين revive في golangci-lint ، تحتاج إلى إضافة revive إلى قائمة المبيدات الممكّنة:
# golangci-lint configuration file
linters :
enable :
- revive ثم يمكن تكوين revive عن طريق إضافة إدخال إلى قسم linters-settings في التكوين ، على سبيل المثال:
# golangci-lint configuration file
linters-settings :
revive :
ignore-generated-header : true
severity : warning
rules :
- name : atomic
- name : line-length-limit
severity : error
arguments : [80]
- name : unhandled-error
arguments : ["fmt.Printf", "myFunction"] يتيح التكوين أعلاه ثلاث قواعد revive : ذري ، خط الطول والخطير غير المعقول ويمرر بعض الحجج إلى الأخيرين. يوفر قسم التكوين في هذا المستند تفاصيل حول كيفية تكوين revive . لاحظ أنه في حين أن تكوين revive في توم ، فإن تكوين golangci-lint موجود في Yaml.
يرجى ملاحظة أنه في حالة عدم توفير تكوين معين ، سيتصرف revive كما يفعل go-lint ، أي يتم تمكين جميع قواعد go-lint (تفاصيل جدول القواعد المتاحة ما هي قواعد go-lint ). عند توفير التكوين ، يتم تمكين القواعد فقط في التكوين.
يقبل revive معلمات سطر الأوامر التالية:
-config [PATH] - مسار إلى ملف التكوين بتنسيق TOML ، الافتراضي إلى $HOME/revive.toml إذا كان موجودًا.
-exclude [PATTERN] - نمط للملفات/الدلائل/الحزم المراد استبعادها للترنين. يمكنك تحديد الملفات التي تريد استبعادها للتصوير إما كاسم حزمة (أي github.com/mgechev/revive ) ، أو إدراجها كملفات فردية (ie file.go ) ، أو الدلائل (أي ./foo/... ) ، أو أي مزيج من الثلاثة. إذا لم يتم تحديد أنماط استبعاد ، فسيتم استبعاد vendor/... افتراضيًا.
-formatter [NAME] التنسيقات المتاحة حاليًا هي:
default - سوف يخرج الفشل بنفس الطريقة التي يفعل بها golint .json - يخرج الفشل في تنسيق JSON.ndjson - يخرج الفشل كدفق في تنسيق Newline المحدد JSON (NDJSON).friendly - يخرج الفشل عند العثور عليه. يوضح ملخص كل الإخفاقات.stylish - تنسيقات الفشل في الجدول. ضع في اعتبارك أنه لا يقوم ببث الإخراج ، لذا قد يُنظر إليه على أنه أبطأ مقارنة بالآخرين.checkstyle - يخرج الفشل بتنسيق XML متوافق مع تنسيق CheckStyle Java. -max_open_files - الحد الأقصى لعدد الملفات المفتوحة في نفس الوقت. الإعدادات الافتراضية إلى غير محدود.
-set_exit_status - قم بتعيين حالة الخروج إلى 1 إذا تم العثور على أي مشكلات ، والكتابة فوق errorCode و warningCode في التكوين.
-version - الحصول على نسخة إحياء.
revive -config revive.toml -exclude file1.go -exclude file2.go -formatter friendly github.com/mgechev/revive package/...revive.tomlrevive file1.go و file2.gofriendlygithub.com/mgechev/revive والملفات في packageباستخدام التعليقات ، يمكنك تعطيل linter للملف بأكمله أو مجموعة من الخطوط فقط:
//revive:disable
func Public () {}
//revive:enable المقتطف أعلاه ، سوف يعطل revive بين revive:disable revive:enable التعليقات. إذا قمت بتخطي revive:enable ، فسيتم تعطيل Linter لبقية الملف.
مع revive:disable-next-line revive:disable-line يمكنك تعطيل revive على خط رمز معين.
يمكنك أن تفعل الشيء نفسه على مستوى القاعدة. في حال كنت ترغب في تعطيل قاعدة معينة فقط ، يمكنك استخدام:
//revive:disable:unexported-return
func Public () private {
return private
}
//revive:enable:unexported-return وبهذه الطريقة ، لن يحذرك revive من أنك تعيد كائنًا من نوع غير محتمل ، من وظيفة تم تصديرها.
يمكنك توثيق سبب تعطيل linter عن طريق إضافة نص زائد في التوجيه ، على سبيل المثال
//revive:disable Until the code is stable //revive:disable:cyclomatic High complexity score but easy to understand يمكنك أيضًا تكوين revive لفرض توثيق توجيهات تعطيل Linter عن طريق إضافة
[ directive . specify-disable-reason ]في التكوين. يمكنك ضبط شدة (التخلف عن السداد على التحذير ) من انتهاك هذا التوجيه
[ directive . specify-disable-reason ]
severity = " error " يمكن تكوين revive مع ملف Toml. فيما يلي تكوين عينة مع شرح للخصائص الفردية:
# When set to false, ignores files with "GENERATED" header, similar to golint
ignoreGeneratedHeader = true
# Sets the default severity to "warning"
severity = " warning "
# Sets the default failure confidence. This means that linting errors
# with less than 0.8 confidence will be ignored.
confidence = 0.8
# Sets the error code for failures with the "error" severity
errorCode = 0
# Sets the error code for failures with severity "warning"
warningCode = 0
# Configuration of the `cyclomatic` rule. Here we specify that
# the rule should fail if it detects code with higher complexity than 10.
[ rule . cyclomatic ]
arguments = [ 10 ]
# Sets the severity of the `package-comments` rule to "error".
[ rule . package-comments ]
severity = " error " بشكل افتراضي ، ستمكن revive فقط من قواعد Linting التي تم تسميتها في ملف التكوين. على سبيل المثال ، يجعل ملف التكوين السابق revive لتمكين قواعد Cyclomatic و Compal-Comments فقط.
لتمكين جميع القواعد المتاحة التي تحتاج إلى إضافتها:
enableAllRules = trueسيمكن ذلك جميع القواعد المتاحة بغض النظر عن القواعد المسمى في ملف التكوين.
لتعطيل قاعدة ، يمكنك ببساطة وضع علامة عليها على أنها معطل في التكوين. على سبيل المثال:
[ rule . line-length-limit ]
Disabled = trueعند تمكين جميع القواعد التي لا تزال بحاجة/يمكن أن توفر تكوينات محددة للقواعد. الملف التالي هو تكوين مثال حيث يتم تمكين جميع القواعد ، باستثناء تلك التي يتم تعطيلها بشكل صريح ، ويتم تكوين بعض القواعد باستخدام وسيطات معينة:
severity = " warning "
confidence = 0.8
errorCode = 0
warningCode = 0
# Enable all available rules
enableAllRules = true
# Disabled rules
[ rule . blank-imports ]
Disabled = true
[ rule . file-header ]
Disabled = true
[ rule . max-public-structs ]
Disabled = true
[ rule . line-length-limit ]
Disabled = true
[ rule . function-length ]
Disabled = true
[ rule . banned-characters ]
Disabled = true
# Rule tuning
[ rule . argument-limit ]
Arguments = [ 5 ]
[ rule . cyclomatic ]
Arguments = [ 10 ]
[ rule . cognitive-complexity ]
Arguments = [ 7 ]
[ rule . function-result-limit ]
Arguments = [ 3 ]
[ rule . error-strings ]
Arguments = [ " mypackage.Error " ] يمكن العثور على التكوين الافتراضي revive في defaults.toml . سيمكن ذلك جميع القواعد المتاحة في golint واستخدام التكوين الافتراضي (أي الطريقة التي يتم بها ترميزها في golint ).
revive -config defaults.toml github.com/mgechev/revive github.com/mgechev/revive ذلك ملف default defaults.toml
revive -config config.toml -formatter friendly github.com/mgechev/revive سيستخدم هذا config.toml ، التنسيق friendly ، وسيتم تشغيله على github.com/mgechev/revive package.
يحتوي المقتطف التالي على تكوين revive الموصى به الذي يمكنك استخدامه في مشروعك:
ignoreGeneratedHeader = false
severity = " warning "
confidence = 0.8
errorCode = 0
warningCode = 0
[ rule . blank-imports ]
[ rule . context-as-argument ]
[ rule . context-keys-type ]
[ rule . dot-imports ]
[ rule . error-return ]
[ rule . error-strings ]
[ rule . error-naming ]
[ rule . exported ]
[ rule . increment-decrement ]
[ rule . var-naming ]
[ rule . var-declaration ]
[ rule . package-comments ]
[ rule . range ]
[ rule . receiver-naming ]
[ rule . time-naming ]
[ rule . unexported-return ]
[ rule . indent-error-flow ]
[ rule . errorf ]
[ rule . empty-block ]
[ rule . superfluous-else ]
[ rule . unused-parameter ]
[ rule . unreachable-code ]
[ rule . redefines-builtin-id ]يمكنك أيضًا إعداد مخصص يستبعد لكل قاعدة.
إنه بديل للبرنامج العالمي -exclude arg.
ignoreGeneratedHeader = false
severity = " warning "
confidence = 0.8
errorCode = 0
warningCode = 0
[ rule . blank-imports ]
Exclude =[ " **/*.pb.go " ]
[ rule . context-as-argument ]
Exclude =[ " src/somepkg/*.go " , " TEST " ]يمكنك استخدام الأنماط التالية استبعاد
src/pkg/mypkg/some.gosrc/**/*.pb.go~.(pb|auto|generated).go$TEST معروف (مثل **/*_test.go )* و ~ الأنماط تستبعد جميع الملفات (نفس التأثير مثل تعطيل القاعدة) ب. "" النمط (الفارغ) يستبعد شيئًاملاحظة: لا تعبث مع
excludeيمكن استخدامه في المستوى الأعلى من ملف TOML ، وهذا يعني "استبعاد أنماط الحزمة" ، وليس "استبعاد أنماط الملفات"
قائمة بجميع القواعد المتاحة. يتم ترك القواعد التي يتم نقلها من golint دون تغيير وتشير إلى عمود golint .
| اسم | تكوين | وصف | golint | مطبوع |
|---|---|---|---|---|
context-keys-type | ن/أ | لا يسمح باستخدام الأنواع الأساسية في context.WithValue . | نعم | نعم |
time-equal | ن/أ | يقترح استخدام time.Time.Equal بدلاً من == و != لوقت فحص المساواة. | لا | نعم |
time-naming | ن/أ | اتفاقيات حول تسمية متغيرات الوقت. | نعم | نعم |
unchecked-type-assertions | ن/أ | لا يسمح التأكيدات على نوع التأكيدات دون التحقق من النتيجة. | لا | نعم |
var-declaration | ن/أ | يقلل من التكرار حول الإعلان المتغير. | نعم | نعم |
unexported-return | ن/أ | يحذر عندما يكون العائد العام من النوع غير المميز. | نعم | نعم |
errorf | ن/أ | يجب استبدال errors.New(fmt.Sprintf()) fmt.Errorf() | نعم | نعم |
blank-imports | ن/أ | لا يسمح الواردات الفارغة | نعم | لا |
context-as-argument | ن/أ | يجب أن يكون context.Context الوسيطة الأولى لوظيفة ما. | نعم | لا |
dot-imports | ن/أ | يمنع . الواردات. | نعم | لا |
error-return | ن/أ | يجب أن تكون معلمة إرجاع الخطأ الماضي. | نعم | لا |
error-strings | []خيط | الاتفاقيات حول سلاسل الأخطاء. | نعم | لا |
error-naming | ن/أ | تسمية متغيرات الخطأ. | نعم | لا |
exported | []خيط | التسمية والتعليق على الاتفاقيات على الرموز المصدرة. | نعم | لا |
if-return | ن/أ | زائدة عن الحاجة إذا كان عند إرجاع خطأ. | لا | لا |
increment-decrement | ن/أ | استخدم i++ i-- بدلاً من i += 1 و i -= 1 . | نعم | لا |
var-naming | lemlist & blocklist of inialisms | قواعد تسمية. | نعم | لا |
package-comments | ن/أ | حزمة التعليق المؤتمرات. | نعم | لا |
range | ن/أ | يمنع المتغيرات الزائدة عند التكرار على مجموعة. | نعم | لا |
receiver-naming | الخريطة (اختياري) | اتفاقيات حول تسمية أجهزة الاستقبال. | نعم | لا |
indent-error-flow | []خيط | يمنع بيانات أخرى زائدة عن الحاجة. | نعم | لا |
argument-limit | int (الافتراضيات إلى 8) | يحدد الحد الأقصى لعدد الوسائط التي يمكن أن تتلقاها الوظيفة | لا | لا |
cyclomatic | int (الافتراضيات إلى 10) | يضع تقييدًا لتحقيق أقصى تعقيد سيكلوماتي. | لا | لا |
max-public-structs | int (الافتراضيات إلى 5) | الحد الأقصى لعدد الهياكل العامة في ملف. | لا | لا |
file-header | سلسلة (الافتراضيات لا شيء) | رأس الذي يجب أن يكون لكل ملف. | لا | لا |
empty-block | ن/أ | يحذر من كتل الرمز الفارغ | لا | نعم |
superfluous-else | []خيط | يمنع بيانات أخرى زائدة عن الحاجة (يمتد indent-error-flow ) | لا | لا |
confusing-naming | ن/أ | يحذر من الأساليب بالأسماء التي تختلف فقط عن طريق الرسملة | لا | لا |
get-return | ن/أ | يحذر من getters التي لا تسفر عن أي نتيجة | لا | لا |
modifies-parameter | ن/أ | يحذر من المهام إلى معلمات الوظيفة | لا | لا |
confusing-results | ن/أ | يقترح تسمية نتائج الوظيفة المحتملة | لا | لا |
deep-exit | ن/أ | يبحث عن مخارج البرنامج في funcs بخلاف main() أو init() | لا | لا |
unused-parameter | ن/أ | يقترح إعادة تسمية أو إزالة معلمات الوظيفة غير المستخدمة | لا | لا |
unreachable-code | ن/أ | يحذر من رمز لا يمكن الوصول إليه | لا | لا |
add-constant | رسم خريطة | يقترح استخدام ثابت للأرقام السحرية والحرفية السلسلة | لا | لا |
flag-parameter | ن/أ | يحذر من المعلمات المنطقية التي تخلق اقتران التحكم | لا | لا |
unnecessary-stmt | ن/أ | يقترح إزالة أو تبسيط البيانات غير الضرورية | لا | لا |
struct-tag | []خيط | يتحقق علامات بنية مشتركة مثل json و xml و yaml | لا | لا |
modifies-value-receiver | ن/أ | يحذر من مهام مستقبلات الأسلوب المتقدمة القيمة | لا | نعم |
constant-logical-expr | ن/أ | يحذر من التعبيرات المنطقية المستمرة | لا | لا |
bool-literal-in-expr | ن/أ | يقترح إزالة الحرفية المنطقية من تعبيرات المنطق | لا | لا |
redefines-builtin-id | ن/أ | يحذر من إعادة تعريف المعرفات المبنية | لا | لا |
function-result-limit | int (الافتراضيات إلى 3) | يحدد الحد الأقصى لعدد النتائج التي يمكن أن تعودها الوظيفة | لا | لا |
imports-blocklist | []خيط | لا يسمح استيراد الحزم المحددة | لا | لا |
range-val-in-closure | ن/أ | تحذر إذا تم استخدام قيمة النطاق في إغلاق تم إرساله كـ goroutine | لا | لا |
range-val-address | ن/أ | يحذر إذا تم استخدام عنوان المدى بشكل خطير | لا | نعم |
waitgroup-by-value | ن/أ | يحذر من وظائف أخذ sync.waitgroup كمعلمة ذات قيمة | لا | لا |
atomic | ن/أ | تحقق من وجود استخدامات خاطئة شائعة للحزمة sync/atomic | لا | لا |
empty-lines | ن/أ | يحذر عندما يكون هناك خطوط جديدة أو متخلف في كتلة | لا | لا |
line-length-limit | int (الافتراضيات إلى 80) | يحدد الحد الأقصى لعدد الأحرف في سطر | لا | لا |
call-to-gc | ن/أ | يحذر من دعوة صريحة إلى جامع القمامة | لا | لا |
duplicated-imports | ن/أ | يبحث عن الحزم التي يتم استيرادها مرتين أو أكثر | لا | لا |
import-shadowing | ن/أ | معرفات البقع التي تظهر استيراد | لا | لا |
bare-return | ن/أ | يحذر من عوائد عارية | لا | لا |
unused-receiver | ن/أ | يقترح إعادة تسمية أو إزالة أجهزة استقبال الطريقة غير المستخدمة | لا | لا |
unhandled-error | []خيط | يحذر من أخطاء غير معروفة من خلال مكالمات الوظائف | لا | نعم |
cognitive-complexity | int (الافتراضيات إلى 7) | يضع تقييدًا لأقصى قدر من التعقيد المعرفي. | لا | لا |
string-of-int | ن/أ | يحذر من قوالب مشبوهة من int إلى سلسلة | لا | نعم |
string-format | رسم خريطة | يحذر من حرفيات سلسلة محددة تفشل واحد أو أكثر من تعبيرات منتظمة تهيئة المستخدم | لا | لا |
early-return | []خيط | البقع إذا كانت عبارات Else حيث قد يتم قلب المسند لتقليل التعشيش | لا | لا |
unconditional-recursion | ن/أ | يحذر من مكالمات الوظائف التي ستؤدي إلى عودة لانهائي (مباشرة) | لا | لا |
identical-branches | ن/أ | بقع إذا كانت عبارات إيليز مع متطابقة then فروع else | لا | لا |
defer | رسم خريطة | يحذر من بعض الجبلات المؤجلة | لا | لا |
unexported-naming | ن/أ | يحذر من رموز غير محررة بشكل خاطئ | لا | لا |
function-length | int ، int (الافتراضيات إلى 50 بيان ، 75 سطر) | يحذر من الوظائف التي تتجاوز العبارات أو الخطوط كحد أقصى | لا | لا |
nested-structs | ن/أ | يحذر من الهياكل داخل الهياكل | لا | لا |
useless-break | ن/أ | يحذر من بيانات break عديمة الفائدة في حالة جمل | لا | لا |
banned-characters | [] String (الافتراضيات لـ [] String {}) | يتحقق الأحرف المحظورة في المعرفات | لا | لا |
optimize-operands-order | ن/أ | يتحقق التعبيرات المشروطة الفعالة | لا | لا |
use-any | ن/أ | يقترح استبدال interface{} بلقبها any | لا | لا |
datarace | ن/أ | بقع مساحات البيانات المحتملة | لا | لا |
comment-spacings | []خيط | يحذر من التعليقات المشوهة | لا | لا |
redundant-import-alias | ن/أ | يحذر من الاسم المستعار استيراد مطابقة اسم الحزمة المستوردة | لا | لا |
import-alias-naming | سلسلة أو خريطة [String] (الافتراضات للسماح لـ regex نمط ^[AZ] [A-Z0-9] {0 ،} $) | اتفاقيات حول تسمية الاسم المستعارة. | لا | لا |
enforce-map-style | سلسلة (الافتراضات إلى "أي") | يفرض استخدامًا ثابتًا لـ make(map[type]type) أو map[type]type{} لتهيئة الخريطة. لا يؤثر make(map[type]type, size) . | لا | لا |
enforce-slice-style | سلسلة (الافتراضات إلى "أي") | يفرض استخدام ثابت لـ make([]type, 0) أو []type{} لتهيئة الشريحة. لا يؤثر make(map[type]type, non_zero_len, or_non_zero_cap) . | لا | لا |
enforce-repeated-arg-type-style | سلسلة (الافتراضات إلى "أي") | يفرض أسلوبًا ثابتًا للوسيطة المتكررة و/أو أنواع قيمة الإرجاع. | لا | لا |
max-control-nesting | int (الافتراضيات إلى 5) | يضع قيودًا على الحد الأقصى من تعشيش هياكل التحكم. | لا | لا |
comments-density | int (الافتراضيات إلى 0) | يفرض علاقة الحد الأدنى من التعليق / الكود | لا | لا |
file-length-limit | الخريطة (اختياري) | يفرض الحد الأقصى لعدد الخطوط لكل ملف | لا | لا |
filename-format | تعبير منتظم (اختياري) | يفرض تنسيق أسماء الملفات | لا | لا |
redundant-build-tag | ن/أ | يحذر من خطوط التعليق زائدة // +build الحاجة | لا | لا |
use-errors-new | ن/أ | نداءات البقع إلى fmt.Errorf التي يمكن استبدالها errors.New | لا | لا |
هنا يمكنك أن تجد كيف يمكنك تكوين بعض القواعد الموجودة:
var-naming تقبل هذه القاعدة شريحتين من الأوتار ، قائمة المسموح بها وقائمة كتلة من الأوليات. بشكل افتراضي ، تتصرف القاعدة تمامًا مثل البديل في golint ولكن اختياريًا ، يمكنك استرخائها (انظر Golint/Lint/Compes/89)
[ rule . var-naming ]
arguments = [[ " ID " ], [ " VM " ]] وبهذه الطريقة ، لن يحذر Revive من معرف يسمى customId ولكن سيحذر من أن customVm يجب أن يسمى customVM .
يسرد هذا القسم جميع التنسيقات المتاحة ويوفر لقطة شاشة لكل واحدة.


ينتج التنسيق الافتراضي نفس الإخراج مثل golint .

ينتج التنسيق العادي نفس الإخراج مثل التنسيق الافتراضي ويؤدي إلى عنوان URL إلى وصف القاعدة.

ينتج Formatter UNIX نفس الإخراج مثل التنسيق الافتراضي ولكنه يحيط بالقواعد في [] .

ينتج json Formatter الإخراج بتنسيق JSON.
ينتج ndjson Formatter الإخراج بتنسيق Newline Delimited JSON .
ينتج تنسيق checkstyle الإخراج بتنسيق يشبه الفحص.
ينتج Formatter sarif المخرجات في SARIF ، لتحليل نتائج التحليل الثابت ، تنسيق التبادل القياسي المستند إلى JSON لإخراج أدوات التحليل الثابت المحددة والترويج بواسطة الواحة.
الإصدار الحالي المدعوم من المعيار هو SARIF-V2.1.0.
يمكن تمديد الأداة بقواعد مخصصة أو تنسيقات. يحتوي هذا القسم على معلومات إضافية حول كيفية تنفيذ مثل هذا.
لتمديد الكتان بقاعدة مخصصة ، يمكنك دفعها إلى هذا المستودع أو استخدام revive كمكتبة (انظر أدناه)
لإضافة تنسيق مخصص ، يجب عليك دفعه إلى هذا المستودع أو شوكة. ويرجع ذلك إلى محدودية -buildmode=plugin الذي يعمل فقط على Linux (مع المشكلات المعروفة).
كل قاعدة تحتاج إلى تنفيذ واجهة lint.Rule :
type Rule interface {
Name () string
Apply ( * File , Arguments ) [] Failure
} نوع Arguments هو الاسم المستعار []interface{} . يتم تمرير وسيط القاعدة من ملف التكوين.
لنفترض أننا قمنا بتطوير قاعدة تسمى BanStructNameRule التي لا تسمح لنا بتسمية بنية مع معرف معين. يمكننا تعيين المعرف المحظور باستخدام ملف تكوين TOML:
[ rule . ban-struct-name ]
arguments = [ " Foo " ]مع المقتطف أعلاه:
ban-struct-name . يجب أن تقوم طريقة Name() لقاعدتنا بإرجاع سلسلة تتطابق مع ban-struct-name .Foo . سيتم تمرير قائمة الوسائط Apply(*File, Arguments) مع الملف المستهدف الذي نقوم به حاليًا.يمكن العثور على تنفيذ قاعدة العينة هنا.
revive كمكتبة إذا كانت قاعدة خاصة بحالة الاستخدام الخاصة بك (أي أنها ليست مرشحًا جيدًا لإضافته إلى مجموعة قواعد revive ) ، فيمكنك إضافتها إلى Linter باستخدام revive كمحرك linting.
يوضح الرمز التالي كيفية استخدام revive في التطبيق الخاص بك. في المثال ، تتم إضافة قاعدة واحدة فقط ( myRule ) ، بالطبع ، يمكنك إضافة أكبر عدد ممكن من الحاجة. يمكن تكوين قواعدك برمجيًا أو مع ملف تكوين revive القياسي. مجموعة القاعدة الكاملة من revive قابلة للتنفيذ أيضًا حسب طلبك.
package main
import (
"github.com/mgechev/revive/cli"
"github.com/mgechev/revive/lint"
"github.com/mgechev/revive/revivelib"
)
func main () {
cli . RunRevive ( revivelib . NewExtraRule ( & myRule {}, lint. RuleConfig {}))
}
type myRule struct {}
func ( f myRule ) Name () string {
return "myRule"
}
func ( f myRule ) Apply ( * lint. File , lint. Arguments ) []lint. Failure { ... } لا يزال بإمكانك الذهاب إلى أبعد من ذلك واستخدام revive بدون CLI ، كجزء من مكتبتك ، أو CLI الخاص بك:
package mylib
import (
"github.com/mgechev/revive/cli"
"github.com/mgechev/revive/revivelib"
"github.com/mgechev/revive/lint"
)
// Error checking removed for clarity
func LintMyFile ( file string ) {
conf , _ := config . GetConfig ( "../defaults.toml" )
revive , _ := revivelib . New (
conf , // Configuration file
true , // Set exit status
2048 , // Max open files
// Then add as many extra rules as you need
revivelib . NewExtraRule ( & myRule {}, lint. RuleConfig {}),
)
failuresChan , err := revive . Lint (
revivelib . Include ( file ),
revivelib . Exclude ( "./fixtures" ),
// You can use as many revivelib.Include or revivelib.Exclude as required
)
if err != nil {
panic ( "Shouldn't have failed: " + err . Error ())
}
// Now let's return the formatted errors
failures , exitCode , _ := revive . Format ( "stylish" , failuresChan )
// failures is the string with all formatted lint error messages
// exit code is 0 if no errors, 1 if errors (unless config options change it)
// ... do something with them
}
type myRule struct {}
func ( f myRule ) Name () string {
return "myRule"
}
func ( f myRule ) Apply ( * lint. File , lint. Arguments ) []lint. Failure { ... }يحتاج كل تنسيق إلى تنفيذ الواجهة التالية:
type Formatter interface {
Format ( <- chan Failure , Config ) ( string , error )
Name () string
} تقبل طريقة Format قناة من مثيلات Failure وتكوين القواعد الممكّنة. يجب أن تُرجع طريقة Name() سلسلة مختلفة عن أسماء القواعد الموجودة بالفعل. يتم استخدام هذه السلسلة عند تحديد النسخة عند استدعاء أداة revive CLI.
لتنسيق عينة ، ألق نظرة على هذا الملف.
بالمقارنة مع golint ، يعمل revive بشكل أفضل لأنه يرتب الملفات لكل قاعدة فردية في goroutine منفصلة. فيما يلي معيار أداء أساسي على تشغيل MacBook Pro في أوائل عام 2013 على Kubernetes:
time golint kubernetes/... > /dev/null
real 0m54.837s
user 0m57.844s
sys 0m9.146s # no type checking
time revive -config untyped.toml kubernetes/... > /dev/null
real 0m8.471s
user 0m40.721s
sys 0m3.262s ضع في اعتبارك أنه إذا كنت تستخدم القواعد التي تتطلب فحص النوع ، فقد ينخفض الأداء إلى 2x أسرع من golint :
# type checking enabled
time revive kubernetes/... > /dev/null
real 0m26.211s
user 2m6.708s
sys 0m17.192sحاليًا ، يتم تمكين فحص النوع افتراضيًا. إذا كنت ترغب في تشغيل Linter دون فحص النوع ، فقم بإزالة جميع القواعد المكتوبة من ملف التكوين.
بشكل افتراضي ، يحدد revive ما إذا كان يجب تلوين إخراجه بناءً على ما إذا كان متصلاً بـ tty أم لا. يعمل هذا لمعظم حالات الاستخدام ، ولكن قد لا يتصرف كما هو متوقع إذا كنت تستخدم revive في خط أنابيب من الأوامر ، حيث يتم تنظيم stdout إلى أمر آخر.
لفرض اللون ، إضافة REVIVE_FORCE_COLOR=1 إلى البيئة التي تعمل فيها. على سبيل المثال:
REVIVE_FORCE_COLOR=1 revive -formatter friendly ./... | tee revive.log| Mgechev | شافاكافا | Denisvmedia | Mfederowicz | Xuri | الإسكندري |
| Ldez | Doniadcld | كليفرن | morphy2k | بيرناردريسنبرغر | dshemin |
| بوتوزوف | كومديف | هاينمان | Gsamokovarov | mdelah | tymonx |
| سينا ديفيل | Rawen17 | دومينيكليفيفري | git-hulk | shmsr | ytnsym |
| Zimmski | MapReal19 | CCE | سكاجي | ccoveille | تامد |
| Markelog | ميهيودور | dvejmz | Abeltay | Damif94 | Groxx |
| Stephenbuttolph | Stephenbrown2 | LSYTJ0413 | Qascade | Ridvansumset | rliebz |
| rdeusser | Rmarku | rnikoopour | رافامادريز | PACO0X | PA-M |
| سينار | Natefinch | نوناتسا | Michalhisim | Zeripath | نعم ياجي |
| TechKnowlogick | Okhowang | Meanguy | Likyh | kerneltravel | Jmckenzieark |
| haya14busa | Fregin | يدا | Willabides | هيفيتو | فنسنتبارون |
| SCOP | vkrol | Kirillsluchaev | جاريما | tartale | tmzane |
| Felipedavid | ثانك | الإندواز | جونيزي | صدى | استيعال |
| Petethepig | Dirk007 | يانغديانغز | ديريكبركينز | بورهام | قائد |
| Hatamiarash7 | أراجور | أمينشيلوه | كولتي | Abirdcfly | أبيناف |
| R-icci | MMCloughlin | ماثيو أوبين | مارتينسربي | avorima | moukoublen |
| شهدت جدا | Johnrichardrinehart | الجدران | Jefersonf | Jamesmaidment | Jalaziz |
| غونغور | رَابِطَة | شبه | Davidhsingyuchen | Gfariasalves-ionos | غورانوف |
| Ginglis13 | فليسر |
معهد ماساتشوستس للتكنولوجيا