أقترح عليك أن تتعرف على نسخة تقرير دنيس إيسيف جيرفاغ " Linter in Go. كيف لطهيها ".
في 50+ linter: ما هو الربح وكيفية دمجها بشكل فعال في عملية التنمية؟ سيكون التقرير مفيدًا لكل من لا يستخدم اللتر بعد ، ولأولئك الذين يستخدمونه بالفعل: سأكشف عن حيل وممارسات غير معروفة للعمل مع اللتر.
من يهتم ، من فضلك ، تحت القط.
مرحبا. اسمي دينيس اساييف. سنتحدث عن كيفية طهي الطعام في تطبيق Go. سيكون التقرير ممتعًا للمبتدئين الذين لم يستخدموا اللغة حتى الآن وللمحترفين. سأخبركم ببعض الحيل غير المعروفة.

قليلا عني. أنا مؤلف مشروع Golangci-lint مفتوح المصدر. عملت في mail.ru. الآن أنا أعمل كقائد TeamLead في الخلفية في Yandex.Taxi. يعتمد تقريري على تجربة مع مئات من مستخدمي Golangci-lint. حول كيفية استخدام linter ، ما هي الصعوبات التي واجهوها وتجربة تطبيق Go linters في mail.ru و Yandex.

سنغطي 5 قضايا رئيسية في التقرير.

أرى في كثير من الأحيان أن الشراب لا يستخدم على الإطلاق. رفع يديك لأولئك الذين يستخدمون linter في جميع المشاريع دون استثناء. ليس كل شيء.

دعنا نتحدث عن سبب عدم استخدامها. في معظم الأحيان عندما أسأل لماذا لا تستخدم يا رفاق ، يقولون إن linter يتداخل معنا. أنها تبطئ فقط التنمية. لا يوجد شيء جيد فيها. هذا صحيح جزئيا. إذا كنت لا تعرف التفاصيل الدقيقة للضبط ، فعندئذ يمكن أن تتداخل حقًا. سنتحدث عن هذا في وقت لاحق قليلا.

بالإضافة إلى ذلك ، فإنهم يعتقدون غالبًا أن اللنتير يجد شيئًا صغيرًا ، شيئًا أنيقًا ، وبعض الأخطاء غير الحاسمة ، وفي الحقيقة لا يستحق ذلك. هل من الأسهل إضاعة الوقت.

الأمثلة المضادة على الفور. تم العثور على خطأ في Docker باستخدام go vet. نسيان الدعوة إلى إلغاء وظيفة. وبسبب هذا ، قد لا ينتهي goroutine الخلفية.

خطأ في مشروع Etcd. العثور على linter go-الناقد اللطيف أن وسيطة string.HasPrefix مشوشة. يعني التحقق من بروتوكول HTTP غير الآمن لن يعمل.

في Go نفسها ، فإن الخلل هو أن العنصر i يُقارن بالعنصر i ، على الرغم من أنه يجب مقارنته بالعنصر j. وجدت أيضا من قبل linter.

ثلاثة أمثلة في المشاريع مفتوحة المصدر الكبيرة التي عثر عليها من قبل linters. سوف يسأل البعض: حسنا ، ماذا في ذلك؟ يجد بعض الخلل الحرجة. عن خطأ حرج واحد ، فإنه يجد 100 ايجابيات غير ناقدة أو خاطئة. يمكنني أن أعطي إحصائياتي العملية: لدي عادة حوالي 80 في المائة من جميع المشكلات التي يبلغ عنها linter: بعض المشكلات الأسلوبية ، على سبيل المثال ، لا يتم استخدام المتغيرات ، وهكذا ، 15 في المائة أخطاء حقيقية وحوالي 5 في المائة إيجابية خاطئة.

الآن دعنا نتحدث عن سبب الحاجة إلى وجود شراب. المكافأة الأكثر أهمية هي أن الأشجار توفر الوقت. والوقت هو المال. كلما وجدت أخطاء ، كلما كلف الأمر تكلفة لشركتك. على الشريحة ، يوجد رسم بياني للتكلفة التقريبية لإصلاح الخلل اعتمادًا على المرحلة التي يوجد بها. وفقًا لذلك ، من كل مرحلة من التطوير إلى الإنتاج ، تزداد التكلفة ثلاث مرات. البحث عن الأخطاء في وقت مبكر ، من الناحية المثالية في IDE وتوفير أموال الشركة.

يحدث غالبًا أنه في CodeReview ، سيقوم المطورون بالإبلاغ عن بعض المشكلات التي قد يجدها اللاجئون. لماذا يفعلون هذا غير مفهومة. أولاً ، يحتاج مؤلف التعليمات البرمجية إلى الانتظار حتى يمر CodeReview. ثانياً ، يحتاج الفاحص نفسه إلى قضاء بعض الوقت في العثور على أي مشاكل ميكانيكية. يمكن أن يثق في هذا إلى Linter. عندما ألاحظ ذلك ، أجبره دائمًا ونتفق معه في الفريق على أنه لا يمكننا النظر في المراجعة لكل ما يمكن العثور عليه من قبل linter. سواء كنا نثق في كل هذا إلى linter. علاوةً على ذلك ، إذا وجدنا بعض المشكلات التي تحدث غالبًا في المراجعة ولم تكن هناك عبوات عليها ، فنحن نحاول العثور على سلالات يمكن أن تصطادها نظريًا. لذلك نحن لا نضيع الوقت في المراجعة.

تتيح لنا Linters أن نضمن بطريقة ما ونوعية التعليمات البرمجية يمكن التنبؤ بها في المشروع. على سبيل المثال ، في هذه الحالة ، هذه وسائط دالة غير مستخدمة.

تسمح لك Linters بالعثور على الأخطاء الهامة في أقرب وقت ممكن ، مما يوفر وقت CodeReview. في الوقت نفسه ، تأكد من جودة كود المشروع.

يحتوي Go على أكثر من 50 ليرة ، ولكن الأكثر شعبية هي 4. هذه هي تلك الموجودة على الشريحة. يتم استخدامها ببساطة لأنها باردة. الباقي عادة لا تريد التعامل معها. الآن أريد أن أوضح بأمثلة نوع من أنواع المشروبات الموجودة هناك. أريد أن أظهر 25 أمثلة linter. الآن سيكون على الأرجح الأكثر أهمية في التقرير.

لنبدأ بالتنسيقات التي تتحقق من التنسيقات. Gofmt هو في الأساس ليس لينتر. ولكن يمكننا أن نعتبرها بمثابة linter. إنه يعرف كيف يخبرنا أنه لا يوجد عدد كافٍ من خلاصات الخطوط ، في أي مكان إضافي. بشكل عام ، هذا هو المعيار للتحقق من تنسيق التعليمات البرمجية والحفاظ عليه.

لدى Gofmt أيضًا خيارات غير معروفة ، والتي تتيح لك تبسيط التعبيرات.

يحتوي Goimports على كل ما تحتويه gofmt ، لكن بالإضافة إلى ذلك لا يزال يعرف كيفية إعادة ترتيب الواردات وحذف وإضافة الواردات الضرورية.

Unindent هو مثل هذا linter الرائع الذي يمكن أن يخفض مستوى تداخل الكود. في هذه الحالة ، يخبرنا أنه إذا قمنا بدمج الاثنين في واحد ، فسوف يكون لدينا انخفاض في مستوى التعشيش بواحد.

دعنا نتفحص أن تتحقق من تعقيدات الكود. أروع منهم هو gocyclo. هو الأكثر مملة. كثير يكرهونه. إنه يتحقق من التعقيد السيكلومي للكود ويقسم عندما يتجاوز تعقيد الوظيفة بعض العتبة. العتبة قابلة للتكوين. إذا كانت التبسيط ، فإن التعقيد السيكلوماتي هو مقدار if في الكود. هنا هو كبير جدا ويقسم linter.

Nakedret هو عبارة عن linter يمكنه أن يقول إنك تستخدم الإرجاع بدون قيم وفي الوقت نفسه تستخدمه في دالة طويلة جدًا. وفقا للدليل الرسمي ، لا ينصح مثل هذه العودة.

هناك مجموعة من أسلوب اختبار linter. على سبيل المثال ، يتحقق gochecknoglobals من أنك لا تستخدم المتغيرات العامة. بالطبع لا يحتاجون إلى استخدامها.

Golint يقسم على نفس المتغير apiUrl. يقول يجب استخدام عنوان URL بحروف كبيرة. منذ هذا الاختصار.

تتأكد Gochecknoinits من أنك لا تستخدم وظائف init. لا ينبغي أن تستخدم وظائف الأولية لأسباب معينة.

gosimple بارد linter. جزء من staticheck أو megacheck. داخل نفسه يحتوي على عدد كبير من الأنماط لتبسيط التعليمات البرمجية. في هذه الحالة ، قد تلاحظ أن السلاسل النصية. لا تحتاج إلى إصلاح ، لأن السلاسل النصية. يحتوي بالفعل على الاختبارات اللازمة ، ويمكنك إزالة إذا.

يتحقق Goconst من عدم وجود حرفية سلسلة مكررة في التعليمات البرمجية الخاصة بك والتي يمكن سحبها إلى ثوابت. عدد هذه التكرارات قابلة للتكوين. في هذه الحالة ، اثنان.

خطأ إملائي linter ، والذي يتحقق من عدم وجود أخطاء مطبعية في الكود في التعليقات. في هذه الحالة ، تحتوي الشريحة على خطأ مطبعي للكلمة الأخرى في نص التعليق. يمكنك تخصيص لهجة الإنجليزية: الأمريكية والبريطانية.

إلغاء التحويل ، الذي يتحقق من أنك لا تجري تحويلات غير ضرورية. في هذه الحالة ، المتغير بالفعل من نوع السلسلة. ليس هناك نقطة في تحويله.

الآن دعنا نرى الشاحنات التي تتحقق من الشفرة غير المستخدمة. الأول هو varcheck. يتحقق من المتغيرات غير المستخدمة.

غير المستخدمة يمكن أن أقسم في الحقول غير المستخدمة من الهياكل.

يخبرنا Deadcode ما إذا كان النوع غير مستخدم.

أو لا يتم استخدام الوظيفة.

يمكن لـ Unparam الإبلاغ عند عدم استخدام وسائط الدالة في نصوص الوظيفة نفسها.

تقارير Ineffassign عندما لا يتم استخدام التغيير بواسطة متغير في التعليمات البرمجية. هذا هو إما نتيجة لنوع من إعادة بناء المساكن. في مكان ما نسوا لتنظيف شيء ، أو خطأ. في هذا المثال ، يتم زيادة العدد. وعلاوة على ذلك ، لا يتم استخدامه كذلك. هذا مشابه جدا لعلة.

هناك مجموعة من أداء اختبار linter. على سبيل المثال ، يخبرنا التالف أن بنية testStruck المحددة يمكن ضغطها من خلال إعادة ترتيب الحقول. علاوة على ذلك ، إذا قمت بتشغيله كجزء من golangci-lint ، فإن لديه خيارًا يتيح لك طباعة الترتيب المطلوب للحقول على الفور ، حتى لا تختارها بنفسك.

هناك مثل هذا لينت gocritic بارد. لديه الكثير من الشيكات في الداخل. واحد منهم ضخم. إنها تعرف كيف تبلغنا عن نسخ هياكل البيانات الثقيلة. في هذه الحالة ، يتم نسخ heavyStruct بالقيمة ونحتاج فقط إلى تمريرها كمؤشر.

يمكن أن تجد Prealloc لنا أماكن في الكود حيث يمكننا نشر الشريحة مسبقًا. يجدها حتى يبحث في المكان الذي نقوم فيه بتكرار ثابت بالساعة على الشريحة. وفي شؤونهم إلحاق. في هذه الحالة ، يمكنك تخصيص متغيرات ret مسبقًا لطول الشريحة ss وحفظ الذاكرة ووحدة المعالجة المركزية.

وأخيرًا ، يكتشف البق أن البق. ربما يجد Scopelint أن الخطأ الأكثر شيوعًا للمبتدئين في الذهاب هو التقاط متغير المدى للحلقة بالرجوع إليها. في هذه الحالة ، يتم التقاط متغير حلقة arg بالرجوع. في التكرار التالي ، سيكون هناك بالفعل معنى مختلف.

Staticcheck. اعتاد أن يطلق عليه megacheck. الآن تمت إعادة تسميته. بسبب هذا ، هناك القليل من الالتباس في المجتمع. Staticcheck يمكن العثور على طن من الحشرات المختلفة. هذا شيء رائع حقا. مثل الذهاب البيطري. واحد منهم على الشريحة سباق. بالطبع ، نحن بحاجة إلى زيادة sync.WaitGroup قبل الدخول إلى goroutine.

يذهب الطبيب البيطري يجد البق في الغالب. في هذه الحالة ، تتم مقارنة المتغير i بحيث تكون النتيجة صحيحة دائمًا. لذلك ، من الواضح أن هناك خطأ. بشكل عام ، يجب عليك دائمًا استخدام go vet.

Gosec لتقف على الذهاب الأمن. يبحث عن مشكلات الأمان المحتملة في Go. في هذه الحالة ، قد تصل بيانات المستخدم إلى arg. لذلك ، يمكن أن يتسلل الأمر rm shell. وهنا ربما قذيفة في العمل على سبيل المثال. وألاحظ أن الذهاب الأمن في كثير من الأحيان تنتج إيجابية كاذبة. لذلك ، أنا في بعض الأحيان إيقاف تشغيله.

يجد Errchek الأماكن التي نسينا فحص الأخطاء. إن أسلوب البرمجة الجيد والآمن يكون دائمًا في كل مكان للتحقق من جميع الأخطاء.

وتجدر الإشارة إلى اثنين من linter بشكل منفصل: staticcheck والذهاب الناقد. لأن داخل كل منهم يحتوي على عشرات ، إن لم يكن المئات ، من الشيكات. لذلك ، تأكد من تجربتها.

الآن لقد درسنا 25 أمثلة linter. وقلت أيضًا أن لدينا أكثر من 50 بطانة في Go. أي لاستخدام؟ أنصحك باستخدام كل شيء إلى الحد الأقصى. فقط قم بتضمين جميع البطانات التي يمكنك. ثم قضاء ساعة والبدء في إيقاف تشغيلها واحدة في وقت واحد. قم بإيقاف تشغيل تلك التي تبدو غير مهمة بالنسبة لك. على سبيل المثال ، يعثر على بعض تحسينات الأداء التي لا تهتم بها على الإطلاق. ستقضي ساعة وستنشئ قائمتك الخاصة من اللنتر لتتمكن من العيش معها أكثر.

يتوفر الكتالوج الكامل لجميع البطانات على الرابط الموجود على الشريحة.

دعونا نتحدث عن كيفية تشغيل linter. في بعض الأحيان يتم إطلاق السلالم باستخدام مواد التبييض هذه. المشكلة هي أنها بطيئة. يتم تنفيذ كل شيء بالتتابع.

يمكننا أن نفعل التنفيذ بالتوازي عبر xargs -P. هناك أيضا مشكلة. أولاً ، هذه ليست سوى 4 لترات. وبالفعل 10 خطوط من التعليمات البرمجية. ماذا يحدث إذا فتحنا 20 ليرة. ثانيا ، هذا التوازي هو ، بعبارة ملطفة ، وليس الأكثر مثالية.

Gometalinter يأتي لانقاذ. Gometalinter عبارة عن مجمع للبطانات يمكنه تشغيله حرفيًا في بضعة أوامر. على الشريحة ، يشبه الأمر الخاص بتشغيل نفس linter الشريحة السابقة. لكنهم لا يحتاجون إلى التثبيت بشكل مستقل ولا يحتاجون إلى أن يتم شمانهم عن طريق التشغيل المتوازي. Gometalinter هو بالفعل موازاة كل شيء تحت غطاء محرك السيارة. لكن لديه مشكلة أساسية واحدة. يبدأ كل linter كعملية منفصلة. الشوك له. إذا أضفنا إلى ذلك أن كل لينتر بداخله يقضي 80 في المائة من الوقت على تحليل الشفرة و 20 في المائة فقط على التحليل نفسه ، اتضح أننا نضيع 80 في المائة من العمل. ولا إعادة استخدام البيانات. يمكننا تحليل البرنامج مرة واحدة ومن ثم إطعام 50 لتر.

لحسن الحظ ، هناك golangci لينت يفعل ذلك بالضبط. يوزع مرة واحدة. أنواع مرة واحدة. مزيد من التحليلات تعمل عليها. بسبب هذا ، فإنه يعمل بشكل أسرع بكثير. أمر إطلاق مماثل على شريحة.

يمكنك أن ترى الرسم البياني على أحد أعمالي 30 ألف سطر من الكود. مشروع صغير وفقط 4 لتر. يمكنك ملاحظة وجود اختلاف كبير في سرعة العمل في بعض الأحيان ، سواء بين الإطلاق التسلسلي ، وبين gometalinter و golangci-lint. إذا كانت هذه اللنت غير 4 ، ولكن 20 ، فإن الفرق سيكون أكبر بكثير.

توضيح مهم حول gometalinter. منذ 7 أبريل ، مؤلف مشروع gometalinter يعلن أنه تم إهماله. تمت أرشفة المستودع وننصح الجميع بالانتقال إلى golangci-lint ، لأنه أسرع ، ولديه المزيد من الأشياء الجيدة هناك. على سبيل المثال ، دعم وحدات الذهاب وهلم جرا.

وإلى جانب وحدات الأداء والذهاب ، تحتوي golangci-lint على كعكات مثل تكوين YAML ، والقدرة على تخطي التحذيرات بطريقة ما ، واستبعادها ، وما إلى ذلك.

يتم تكوين Golangci-lint باستخدام ملف golangci-lint.yaml. مثال على هذا الملف مع وصف لجميع الخيارات على الرابط في الشريحة. النظر ، على سبيل المثال ، قسم إعدادات linters. في هذا القسم ، سنقوم بتكوين إعدادات الواردات. لديه خيار بادئات محلية نادرة. في ذلك ، يمكنك تحديد المسار إلى المشروع الحالي. في هذه الحالة ، على سبيل المثال ، github.com/local/repo.

عندما ترى goimports الواردات المحلية في github.com/local/repo ، فستتأكد من وجودها في قسم منفصل.

بحيث تكون في النهاية. بحيث تكون منفصلة عن جميع الواردات الخارجية. هذا يجعل من السهل التمييز بصريا بين الواردات الخارجية والداخلية. إذا لاحظ أن هذا ليس كذلك ، فسيقسم.

وإذا كنت تستخدم أيضًا الخيار - fix golangci-lint ، فسوف يقوم golangci-lint بإصلاحه تلقائيًا وإعادة ترتيب الواردات.

دعونا نتحدث عن ماهية اللتر في مصطلحات golangci-lint. وينقسم Linter إلى سريع وبطيء. تسمى الصياميات السريعة ، والتي تحمل العلم السريع في المساعدة. إنها تختلف في أن الأصناف السريعة تتطلب تمثيلًا محدودًا إلى حد ما للبرنامج ، على سبيل المثال ، شجرة AST وبعض معلومات النوع. بينما لا تزال البطانات النحاسية تتطلب أيضًا تقديم SSA بواسطة البرنامج وإعادة استخدام ذاكرة التخزين المؤقت أقل. لا يوجد سوى ستة بطانات بطيئة. يتم وضع علامة على الشريحة. هناك حالات معينة عندما يكون من المنطقي أن يتم تشغيل linter فقط بسرعة.

قد تلاحظ اختلافًا في السرعة. انها هائلة ثلاث مرات بين بداية سريعة وبطيئة. في الواقع تشغيل golangci-lint - يتم إطلاق فوهات سريعة فقط.

حول بناء ذاكرة التخزين المؤقت. هناك شيء مثل بناء ذاكرة التخزين المؤقت. هذا هو ذاكرة التخزين المؤقت التي يقوم الثنائي Go بإنشائها عند ترجمة البرنامج عندما يتم تحميل الأنواع ، بحيث تكون هذه الترجمة أسرع في المرة التالية. يتم إعادة استخدام ذاكرة التخزين المؤقت نفسها بواسطة linters لتحليل البرامج لإنشاء معلومات النوع. قد تلاحظ أنه إذا قمت بمسح ذاكرة التخزين المؤقت ، فستكون البداية الجديدة الأولى طويلة جدًا. والقادم سيكون أسرع 3 مرات. إيلاء الاهتمام لإطلاق أول linter في مشروعك. سيكون دائما أبطأ بكثير.

هنا يمكنك أن تستنتج أنه من المنطقي في CI بين إطلاق CI لإعادة استخدام ذاكرة التخزين المؤقت. لن تسارع فقط في تسكع الملابس ، بل ستسرع أيضًا في إجراء الاختبارات ، وتجميعها فقط وربما شيء آخر. أنصح الجميع.

لا أستطيع التحدث عن تحليل الذهاب. هذا إطار جديد ظهر منذ الإصدار 1.12. إنه يوحد الواجهات بطريقة تجعل من السهل كتابة linter ، linter سهل الاستخدام والتشغيل. Go البيطري يبدأ 1.12 تماما تحولت تماما للذهاب التحليل. من الواضح ، هذا هو المستقبل. أنه سوف يغير كثيرا من النظام البيئي بأكمله من الذهاب. لكن في الوقت الحالي ، من المبكر جدًا الحديث عن ذلك. إذن ماذا سيحدث بعد ذلك؟ لأنني لم أشاهد سوى القليل من اللمبات التي لا تزال قيد التحليل ، ولم يتحول أي منها تقريبًا إلى تحليل حتى الآن.

إذا توصلت إلى استنتاج موجز حول القسم الخاص بكيفية تشغيل الوبر ، فإنني أنصح الجميع باستخدام golangci-lint. ستعمل بسرعة على تشغيل البطانات بسهولة. لا تحتاج إلى شامان مع تعليمات أخرى ، الأوامر.

دعونا نتحدث عن كيفية تنفيذ linter في المشروع. أعتقد أن هناك كل من حاول تقديم مشروبات واجه مشكلة من هذا القبيل. هنا لديك مشروع لمليون سطر من التعليمات البرمجية مع التاريخ. لقد أقنعت TeamLead بتنفيذ الملابس. إطلاق ورؤية مليون رسالة. افهم أنه ليس لديك وقت للجلوس لأسابيع لإصلاحه بالكامل. ما يجب القيام به يمكنك فقط التخلي عن كل شيء. أو يمكنك الخروج بشيء ما.

أولاً ، الخيار الأسهل ، يمكنك محاولة استبعاد بعض التعليقات من linters على النص بشكل منتظم باستخدام التكوين golangci-lint.yaml. إذا رأيت أن هناك أشباحًا تؤدي اليمين الدستورية للتعليقات ، لكنك لا تهتم عمومًا بهذه التعليقات ، يمكنك إضافة الاستثناءات.

يمكن استبعادها من الطرق. على سبيل المثال ، لديك دليل جهة خارجية ورمزك غير موجود. لا تحتاج إلى التحقق من ذلك. يمكن استبعادها من خلال أسماء الملفات.

إذا كنت لا تريد استبعاد الملف بأكمله ، فيمكنك استبعاد الوظيفة باستخدام nolint قبل الوظيفة. بالنسبة إلى nolint ، يمكنك تحديد قائمة من اللقاحات من خلال النقطتين ، والتي تعمل بمثابة استثناء. أم لا لتحديد ، ثم سيتم تجاهل كل linter.

متى تستخدم نولينت على الإطلاق؟ على سبيل المثال ، أنا أستخدم nolint: deepguard ، والذي يمكنه التقاط الواردات ، أي لا يمكن استخدام الواردات. لقد فاجأت استيراد مكتبة logrus حتى لا تستخدمها عن طريق الخطأ بدلاً من المسجل المطلوب. ولكن في بلدي المسجل نفسه يمكنني استخدام logrus. لذلك ، أحتاج فقط في مكان واحد في المشروع لإنشاء ملف واحد فقط من الاستيراد. أنا علامة عليه مع nolint.

لنفترض أنك فعلت كل هذا ، أضف استبعادًا ، ولصق nolint. نرى أنه لا يزال هناك الآلاف من الرسائل المتبقية. إصلاحه بضعة أيام. هناك الاختراق بارد. لنلقِ نظرة على مثال. يوجد ملف main.go يُضاف فيه السطر الخامس منذ زمن بعيد ، ويُضاف السطر السادس اليوم فقط. ماذا يمكننا أن نفعل؟

يمكننا استخدام revgrep. Revgrep يسمح لنا بتحديد مراجعة git ، وبعد ذلك نحتاج إلى البحث عن الأخطاء. وهذا يعني ، ترك رسالة إلى linter فقط بعد مراجعة معينة. إذا تم تغيير السطر السادس بعد سيد الأصل ، فإنه سيتم إصلاحه فقط. وجميع الرسائل السابقة ، وقال انه لن يبلغ السطر الخامس. . . . golangci-lint . . , . git hash commit. . . hash commit tag revgrep CI. . . . mail.ru, .

revgrep golangci-lint. --new-from-rev --new. .

. --new. 20 , . . . . . ? --new-from , . .

. golangci-lint . . . , .

تحدثنا عن إدخال linter في أي مشروع. الآن دعنا نتحدث عن راحة العمل. أولاً ، تحتاج إلى تحقيق استنساخ في CI. بمجرد إضافة linter إلى CI ، فإنك بحاجة إلى أن تكون مستقرة. لا تذهب ابدا. لأنه ليس إصدارها. تم تغيير Linter في أي وقت ، وتحديثه ، وبدأت كافة بنيات CI في الفشل. لقد رأيت هذا عشرات المرات. دائما استخدام إصدارات محددة. أفضل مع wget وضعه. ستكون أسرع. بالإضافة إلى ذلك ، لا أوصي باستخدام خيار --- enable-all لـ linter ، لأنه في يوم من الأيام تقوم بتحديث golangci-lint ، على سبيل المثال ، يمكنك إضافة 5 linter جديد وتبدأ كل الإنشاءات في الفشل. لأنك تحولت بطريق الخطأ على هذه linter. من الأفضل أن تحدد صراحةً أي أنواع اللتر التي تدرجها.

الشيء الرائع هو ربط ما قبل الالتزام. من يستخدم الخطاف المسبق ارفع يديك؟ القليل جدا. ربط ما قبل الالتزام هو ملف git يسمح لك بتنفيذ تعليمات برمجية عشوائية بعد رغبتك في الالتزام. ولكن قبل هذا الالتزام ينجح. في حالة إرجاع ربط الالتزام المسبق خطأ ، سيفشل الالتزام. عادة ما يكون من المناسب تضمين اختبارات سريعة وتحليل ثابت وما إلى ذلك. أنصح الجميع بتضمين golangci-lint. يمكنك القيام بذلك يدويًا من خلال البرنامج النصي shell. فمن الممكن من خلال الأداة المساعدة المسبقة. مثال عن كيفية الإعداد على شريحة. يقوم بالتثبيت المسبق مع pip ، أداة مساعدة لتثبيت حزم Python. تثبيت نقطة قبل الالتزام بتثبيت التكوين. Golangci-lint يدعم بالفعل التكامل مع الالتزام المسبق.

خيار --fast. عدنا لها. أنصح الجميع لاستخدامه في IDE. بشكل عام ، يجب على IDE ، بطبيعة الحال ، استخدام التكامل مع اللتر. من أجل عدم تجميد IDE الخاص بك ، تأكد من استخدام خيار --fast.

أعتقد أن هذا واضح جدا. في CI ، يجب أن تكون جزءا لا يتجزأ من linters. إذا لم تقم بتضمينها ، فستكون هناك صورة كلاسيكية: "دعنا نطرحها الآن ، والآن لدينا إصدار ، وليس قبل ذلك". تدريجيا سيكون لديك المزيد والمزيد من التعليقات. أنت فقط تتوقف عن النظر في linters كصف. لذلك ، بدقة في CI. علاوة على ذلك ، يمكنك ببساطة تثبيت الوبر في CI ، مع فشل التصميم ، فنحن نتسلق سجل البناء ، ونبحث عن سبب سقوطه هناك. أين هو التعليق ، على أي سطر؟ هذه ليست مريحة للغاية.

هناك طريقة أكثر برودة. يمكنك جعل linter بمثابة شخص ، كمراجع. يمكنهم التعليق عليك على github.com ، gitlab.com للحصول على سطر من رمز الخطأ في طلب السحب الخاص بك. يمكن أن يكتب لينتر أنه وجد مشكلة. هذا رائع بشكل لا يصدق. هذا يوفر الوقت رمز المؤلفين. لأنه ليس عليك الدخول إلى سجل البناء. بالإضافة إلى ذلك ، يمكن لأي شخص التعليق إذا كان لا يوافق على هذا التصريح من linter. في المثال الموجود على الشريحة ، يتم ذلك باستخدام الأداة المساعدة reviewdog. مفتوحة المصدر فائدة. إنها حرة. يمكنك تثبيت نفسك.

بالإضافة إلى reviewdog ، هناك أيضًا مشاريع مثل GolangCI و Code Climate و Hound. إنها تسمح لك بتوصيل هذه المصابيح بنقرة واحدة فقط إلى مستودعاتك المفتوحة أو المستودعات الخاصة والتعليق المضمّن في طلب السحب. لا يزال هناك شيء رائع SonarQube.

لا أستطيع أن أذكر goreportcard حتى الآن. يتيح لك هذا المشروع إنشاء تقرير في مستودعك. وضعوا الدرجات هناك ، وقدموا شارة ، واكتبوا مدى جودة الرمز الخاص بك لتنظيف أكثر من عشرة. أنا أنصح أيضا.

أود منك أن تأتي للعمل يوم الاثنين وأن تكون قادرًا على تطبيق شيء مما قلت. فيما يلي ملخص لما يمكنك تقديمه. أول تثبيت golangci لينت. بدوره على جميع البطانات هناك. ثم قضاء 1 ساعة. خلال هذه الساعة ، قم بإيقاف تشغيل جميع الأنواع التي تبدو وهمية لك. بعد ذلك ، قم بتضمين golangci-lint في CI ، في IDE ، وقم بتكوين ربط الالتزام المسبق. بعد ذلك مباشرةً ، يمكنك تكوين - new-from-rev والإشارة إلى أنه من الالتزام الحالي ، نبحث عن أخطاء. وسيتم إصلاح جميع الأخطاء السابقة في وقت لاحق بشكل منفصل. بعد ذلك ، قم بتكوين المراجعة بشكل اختياري بحيث لا يزال يعلق عليك على github أو في gitlab. سوف تزيد من جودة المشروع مع هذا بشكل كبير. فرحة الفريق بأكمله.

شكرا لكم جميعا على اهتمامكم. جهات الاتصال الخاصة بي على الشريحة.
سؤال: أخبرني ، هل لديك ملفات تهيئة جاهزة تضعها في متناول الجميع والتي يمكنك ببساطة تنزيلها واستخدامها حتى لا تفهم الكثير من إعدادات golangci-lint؟ ما تنصحني به
الجواب: فكرة جيدة. Golangci-lint نفسها لديها بالفعل golangci-lint.yaml ، والتي تستخدمها. يمكنك استخدامه كنقطة انطلاق.
سؤال: على الشريحة الخاصة ببناء ذاكرة التخزين المؤقت ، راجع ذاكرة التخزين المؤقت للوحدات النمطية. في ذاكرة التخزين المؤقت ، يمكنك تحديد ذاكرة التخزين المؤقت الكاملة للوحدات النمطية. يمكنك تحديد .cache / download ثم سيكون هناك فرق كبير إلى حد ما: 400 ميغابايت مقابل 10. هذا يكفي لاستخراج الوحدات النمطية ببساطة. ولكن هذا فقط إذا تم استخدام الوحدة.
سؤال: هل ستدعم أيضًا وحدات الإدخال أو الانتقال أو الانتقال إلى شيء واحد؟
الجواب: لا حاجة يدعم أحد. الآن هناك مكتبة حزم الذهاب. انها تشارك في تحميل شفرة المصدر. وهو يدعم كل من وحدات وغير وحدات. إنها لن تقوم حتى الآن بإزالة الدعم لغير الوحدات النمطية.
السؤال: هل تخطط لإنشاء مكونات إضافية للتكامل مع Travis ليس فقط ، ولكن أيضًا مع خوادم الأتمتة الأخرى؟
الإجابة: golangci-lint لا يقوم بأي تكامل. لتشغيل في CI ، ما عليك سوى الاتصال بـ golangci-lint - run.
سؤال: لتحليل بعض التقارير ، على سبيل المثال ، في جنكينز ، نقوم بحفظ ملف html.
الإجابة: يوجد تنسيق إخراج junit ، csv ، json xml. كل هذا يمكن بالفعل تحليلها.
السؤال: استخدمنا gometalinter من قبل وكان بطيئا. ثم تحولنا إلى linter دعا إحياء. لم تذكره على الإطلاق. من ناحيتي ، أنا لست خبيراً في الموضوع على الإطلاق. لم أكن أعرف عن linter الخاص بك ، الذي كنت تقول. هل يمكن أن تكتب في النهاية دعنا نقول إيجابيات linter أو إيجابيات إحياء.
الجواب: إحياء golint إعادة كتابتها. هذا هو مجرد واحد من linter. هناك إعدادات. وأضاف أيضا بعض linter ، عدد قليل من الشيكات. Golangci لينت هو في حد ذاته 30-50 linter. هذا هو إحياء واحد ونصف لتر. إحياء بارد لأنه يأخذ golint ويجعلها موازية. إحياء العمل بشكل أسرع من golint. ولكن هذا هو مجرد linter. يمكن أن يكون إحياء جزء من golangci لينت.
سؤال: لقد كان لديك شريحة في مراجعة من linters حول gocritic: hugeParam ، الذي يوصى به لنقل هياكل جريئة عن طريق المؤشر. ولكن هذا سوف يؤدي إلى حقيقة أن جميع هذه الهياكل سيتم تخصيصها حصرا في برنامج HEAP. وهذا لن يؤدي إلى مشاكل أكبر من المزايا؟ إذا كانت هذه الهياكل ، على سبيل المثال ، تنتقل كثيرا.
الجواب: أنا أتفق تماما. يجب ألا تستخدم هذه التحذيرات ولا تتبعها فقط. يمكن أن يكون مثل التحسين السابق لأوانه ، يمكن أن يضر المشروع. عادةً ما أقوم بإيقاف تشغيل هذا النوع من البطانات بشكل عام إذا لم يكن لدي أداء مهمة حرجة. حيث أجد نقاط الضعف مع المحلل.
سؤال: أنا من ياندكس. نحن نستخدم linter الخاص بك على مستودع كبير. لقد لاحظنا أنه بدأ بالفعل العمل بسرعة كبيرة لمستودع كبير. في غضون يومين فقط ، كتبوا أداة مساعدة بسيطة من خلال go package للعثور على الحزم التي تغيرت منذ إدخال الفرع من المعالج والحزم التي تعتمد عليها. وتشغيل لينتر فقط عليها. وفحص linter تحقق تسارع عدة مرات.
الإجابة: ربما ستقوم بإنشاء ملف تعريف ، وإرفاق نص ، وربما أقوم بتضمين كل هذا في golangci-lint.
سؤال: هل تم تحديد مستويات الجدية للتعليقات الموجودة بحيث يمكن إدراج بعضها في التقرير ، ولكنها لا تزييف عملية CI؟ على سبيل المثال ، من خلال رمز الإكمال.
الإجابة: سأل الكثير من الناس وسأقول على الفور الصعوبة في أن مستويات الجدية هذه تدعمهم جميعًا هناك 3 أو 4 من أصل 30. ماذا تفعل مع الفولاذ؟ هذا غير واضح. من الضروري تحليل تعليقاتهم يدويًا ووضع علامة عليها بطريقة أو بأخرى. التعامل مع ايجابيات كاذبة. هذا هو عموما كمية كبيرة من العمل. لست متأكدا من ما سيتم القيام به عندما. هناك طرق أخرى لتحقيق نفس الهدف.
سؤال: هناك مقالات على المحور بتعبير أدق ، سلسلة من المقالات حول C ++ linter. تقوم الشركة بتطوير هذا العمل. انهم كسب المال منه. في الواقع ، لم يعد عملهم ، أو بالأحرى هذه السلسلة من المنشورات ، موجهاً إلى المطورين ، ولكن إلى أولئك الذين يديرون المطورين. هذا هو رمز نقية أساسا ، والأسلوب. هذه هي مهمتنا ، ولكن أيضًا مهمة القادة وقادة الفريق. هل تخطط لتعميم هذا النوع من الوسائط هنا ، بكميات كبيرة من الموارد ، بحيث يقرأه الناس ثم يعرضونه على فرقهم؟ وليس طرقنا من الأسفل.
الجواب: كان لدي خطة. شكرا على الاقتراح كان لدي خطط لكتابة مقال شامل مثل هذا الخطاب ، ولكن هناك بمزيد من التفصيل وعلى نطاق واسع على مدار العام. ربما سأكتب بالروسية والإنجليزية.