हमारे संगठन में, हम विभिन्न वेब सेवाओं के साथ कई GitHub रिपॉजिटरी चला रहे हैं। इन सभी परियोजनाओं को कोड स्टाइलिंग के लिए सामान्य नियमों की आवश्यकता होती है। हम सही तरीके से आगे बढ़े और एक सर्विस टेम्प्लेट प्रोजेक्ट बनाया जो सभी .NET समाधानों का आधार है और एक सामान्य आर्किटेक्चर को परिभाषित करता है। इसमें सही नामकरण और संदर्भों के साथ परियोजनाओं का एक समूह होता है। हालाँकि, हम गलत तरीके से चले गए और .editorconfig
फ़ाइल को हर नए रिपॉजिटरी में कॉपी कर लिया। जब भी .editorconfig
फ़ाइल डेवलपर की ज़रूरतों के अनुरूप नहीं होती है तो उसे संशोधित करने का प्रलोभन दिया जाता था। और हमने यह गलती की।
एक सामान्य .editorconfig
फ़ाइल कैसे बनाई जाए और इसे कई रिपॉजिटरी में कैसे वितरित किया जाए, इस बारे में इंटरनेट पर अधिक जानकारी नहीं है। देव भावना ने बताया कि यह एक NuGet पैकेज होना चाहिए। समस्या को गुगल करने के लंबे समय के बाद, हमें यह समाधान मिला। एडम क्रेवन को धन्यवाद जिन्होंने अपनी परियोजना के लिए उसी मुद्दे को हल किया।
EditorConfig विभिन्न संपादकों और IDE में एक ही प्रोजेक्ट पर काम करने वाले कई डेवलपर्स के लिए लगातार कोडिंग शैलियों को बनाए रखने में मदद करता है। EditorConfig प्रोजेक्ट में कोडिंग शैलियों को परिभाषित करने के लिए एक फ़ाइल स्वरूप और टेक्स्ट संपादक प्लगइन्स का एक संग्रह शामिल है जो संपादकों को फ़ाइल प्रारूप को पढ़ने और परिभाषित शैलियों का पालन करने में सक्षम बनाता है। EditorConfig फ़ाइलें आसानी से पठनीय हैं और वे संस्करण नियंत्रण प्रणालियों के साथ अच्छी तरह से काम करती हैं।
.NET दुनिया में, कोड विश्लेषण नियमों में विभिन्न कॉन्फ़िगरेशन विकल्प होते हैं। आप इन विकल्पों को निम्न विश्लेषक कॉन्फ़िगरेशन फ़ाइलों में से एक में कुंजी-मान जोड़े के रूप में निर्दिष्ट करते हैं:
EditorConfig फ़ाइल: फ़ाइल-आधारित या फ़ोल्डर-आधारित कॉन्फ़िगरेशन विकल्प।
ग्लोबल एनालाइज़र कॉन्फ़िग फ़ाइल: प्रोजेक्ट-स्तरीय कॉन्फ़िगरेशन विकल्प। उपयोगी जब कुछ प्रोजेक्ट फ़ाइलें प्रोजेक्ट फ़ोल्डर के बाहर रहती हैं।
आप निम्न सिंटैक्स के साथ EditorConfig फ़ाइल में कंपाइलर चेतावनियों या विश्लेषक नियमों के लिए गंभीरता सेट कर सकते हैं:
dotnet_diagnostic.<rule ID>.severity = <severity>
किसी EditorConfig फ़ाइल में किसी नियम की गंभीरता को सेट करना किसी नियम सेट में या समाधान एक्सप्लोरर में सेट की गई किसी भी गंभीरता पर प्राथमिकता लेता है।
कुछ परियोजनाओं में, स्थानीय और वैश्विक कॉन्फ़िगरेशन फ़ाइलों का मिश्रण होता है। इसके अलावा, इस लेख में सीमा अनुभाग में निर्दिष्ट .NET दुनिया में भी EditorConfg की कुछ सीमाएँ हैं। हमने दोनों तरीकों की कोशिश की और इन दो दृष्टिकोणों के साथ आगे-पीछे हुए। और अंत में हमारी परियोजनाओं के लिए केवल EditoConfig का उपयोग करने का एक आसान तरीका स्थानांतरित करने का निर्णय लिया।
सबसे पहले चीज़ें, आपको NuGet पैकेज के लिए एक नया C# लाइब्रेरी प्रोजेक्ट बनाने की आवश्यकता है। आइए इसे MyProject.EditorConfig
कहते हैं। इस परियोजना में निम्नलिखित फाइलें होंगी:
.props
फ़ाइल.csproj
फ़ाइल.editorconfig
फ़ाइलआपको PropertyGroup को निम्नलिखित गुणों के साथ सही मान पर सेट करना होगा:
<PropertyGroup> <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild> <EnableNETAnalyzers>true</EnableNETAnalyzers> </PropertyGroup>
EnforceCodeStyleInBuild
- EditorConfig फ़ाइल में निर्दिष्ट कोड शैली नियमों को बिल्ड के हिस्से के रूप में जांचने की अनुमति देता है;EnableNETAnalyzers
.NET 5.0 के लिए डिफ़ॉल्ट रूप से सत्य है , बल्कि .NET के पुराने संस्करणों का समर्थन करने के लिए इसे सही पर सेट करें;
जैसा कि EditorConfig की सीमाओं में से एक यह है कि कुछ नियमों में Location.None
है। कोई नहीं और एक EditorConfig फ़ाइल में निर्दिष्ट नहीं किया जा सकता है। यदि आप हमारी तरह ग्लोबल एनालाइज़र कॉन्फिग फ़ाइल का उपयोग नहीं करते हैं, तो आपके पास उन नियमों को .props
फ़ाइल में अक्षम करने का विकल्प होगा:
<PropertyGroup> <NoWarn>$(NoWarn);CA1014</NoWarn> </PropertyGroup>
NuGet पैकेज फ़ोल्डर संरचना के भीतर से कॉपी करने के लिए .editorconfig
फ़ाइल का स्थान निर्दिष्ट करें:
<ItemGroup> <EditorConfigFilesToCopy Include="$(MSBuildThisFileDirectory)../content/Rules/.editorconfig" /> </ItemGroup>
विभिन्न प्लेटफार्मों पर फ़ाइल पथ स्ट्रिंग में
\
और/
प्रतीकों से सावधान रहें। हमें वास्तव में यह पता लगाने में काफी समय लगा कि.editorconfig
फ़ाइल कॉपी क्यों नहीं की जाती है।
बनाया जा रहा है जो .NET प्रोजेक्ट के फ़ोल्डर में फ़ाइल की प्रतिलिपि बनाने के लिए MSBuild Copy
कार्य का उपयोग करें। यह लक्ष्य BeforeBuild
से पहले बिल्ड लक्ष्य से पहले निष्पादित करने के लिए परिभाषित किया गया है।
<Target Name="CopyEditorConfig" BeforeTargets="BeforeBuild"> <Message Text="Copying the .editorconfig file from '@(EditorConfigFilesToCopy)' to '$(SolutionFolder)'"></Message> <Copy SourceFiles="@(EditorConfigFilesToCopy)" DestinationFolder="$(SolutionFolder)" SkipUnchangedFiles="true" UseHardlinksIfPossible="false" /> </Target>
डिफ़ॉल्ट रूप से, एक अवधि के साथ शुरू होने वाली NuGet फ़ाइलों को पैक करते समय अनदेखा कर दिया जाता है। इससे बचने के लिए आपको .csproj
फ़ाइल में निम्न कोड जोड़ना होगा:
<PropertyGroup> <NoDefaultExcludes>true</NoDefaultExcludes> </PropertyGroup>
उसके बाद आपको .props
और .editorconfig
फाइल को शामिल करना होगा:
<ItemGroup> <None Include="MyProject.EditorConfig.props" Pack="true" PackagePath="\build" /> <None Include=".editorconfig" Pack="true" PackagePath="\content\Rules" /> </ItemGroup>
जब सारा काम हो जाए तो आप NuGet पैकेज को स्थानीय स्टोरेज में प्रकाशित कर सकते हैं और सत्यापित कर सकते हैं कि यह काम करता है।
NuGet पैकेज पैक करने के लिए MyProject.EditorConfig
प्रोजेक्ट फ़ोल्डर में निम्न आदेश निष्पादित करें:
dotnet pack MyProject.EditorConfig.csproj -c Release -o out --no-restore
इसे स्थानीय भंडारण (फ़ोल्डर) में प्रकाशित करें। NuGet CLI को पहले से इंस्टॉल करना होगा:
nuget add out/MyProject.EditorConfig.1.0.0.nupkg -Source /Users/igorlopushko/test_nuget_expand/ -Expand
-Source
पैरामीटर के साथ एक लक्ष्य फ़ोल्डर निर्दिष्ट करें।
स्थानीय NuGet पैकेज पथ पंजीकृत करें:
dotnet nuget add source /Users/igorlopushko/test_nuget_expand/
लक्ष्य प्रोजेक्ट में स्थानीय NuGet पैकेज जोड़ने के लिए इस कमांड को लक्ष्य प्रोजेक्ट के फ़ोल्डर में निष्पादित करें:
dotnet add package MyProject.EditorConfig -s /Users/igorlopushko/test_nuget_expand/
जब आप अपना लक्ष्य प्रोजेक्ट बनाते हैं तो आपको इस प्रोजेक्ट की रूट डायरेक्टरी में .editorconfig
फाइल मिल जाएगी। हर बार जब आप कोई प्रोजेक्ट बनाते हैं तो इसे अधिलेखित कर दिया जाएगा। भले ही इसे गलती से किसी भी तरह से संशोधित किया गया हो, .editorconfig
फ़ाइल को बिल्ड पर अधिलेखित कर दिया जाएगा।
समाधान काफी सरल है, लेकिन इसने हमारी टीम के जीवन को आसान बना दिया है। हमने इस NuGet पैकेज को अपनी सभी परियोजनाओं में जोड़ा है और सभी रिपॉजिटरी में कोड शैलियों में डीसिंक्रनाइज़ेशन से बचते हैं।