असेंबली एट्रीब्यूट्स का उपयोग करने के लिए सर्वोत्तम अभ्यास क्या हैं?


163

मेरे पास कई प्रोजेक्ट के साथ समाधान है। मैं एक समाधान विस्तृत असेंबली जानकारी फ़ाइल को जोड़कर असेंबलीइन्फो.फ़ॉक्स फ़ाइलों को अनुकूलित करने का प्रयास कर रहा हूं। ऐसा करने के लिए सर्वोत्तम अभ्यास क्या हैं? कौन सी विशेषताएँ समाधान विस्तृत फ़ाइल में होनी चाहिए और कौन सी परियोजना / विधानसभा विशिष्ट हैं?


संपादित करें: यदि आप रुचि रखते हैं तो एक अनुवर्ती सवाल है कि असेंबलीव्यूलेशन, एसेम्बलीफाइल वर्जन और असेंबली इनफॉर्मेशनलवर्जन के बीच अंतर क्या हैं?

जवाबों:


207

हम GlobalAssemblyInfo.cs नामक एक वैश्विक फ़ाइल और असेंबलीInfo.cs नामक एक स्थानीय फ़ाइल का उपयोग कर रहे हैं। वैश्विक फ़ाइल में निम्नलिखित विशेषताएँ हैं:

 [assembly: AssemblyProduct("Your Product Name")]

 [assembly: AssemblyCompany("Your Company")]
 [assembly: AssemblyCopyright("Copyright © 2008 ...")]
 [assembly: AssemblyTrademark("Your Trademark - if applicable")]

 #if DEBUG
 [assembly: AssemblyConfiguration("Debug")]
 #else
 [assembly: AssemblyConfiguration("Release")]
 #endif

 [assembly: AssemblyVersion("This is set by build process")]
 [assembly: AssemblyFileVersion("This is set by build process")]

स्थानीय असेंबलीInfo.cs में निम्नलिखित विशेषताएं हैं:

 [assembly: AssemblyTitle("Your assembly title")]
 [assembly: AssemblyDescription("Your assembly description")]
 [assembly: AssemblyCulture("The culture - if not neutral")]

 [assembly: ComVisible(true/false)]

 // unique id per assembly
 [assembly: Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]

आप GlobalAssemblyInfo.cs को निम्न प्रक्रिया का उपयोग करके जोड़ सकते हैं:

  • प्रोजेक्ट के संदर्भ मेनू में Add / मौजूदा आइटम ... का चयन करें
  • GlobalAssemblyInfo.cs का चयन करें
  • दायें हाथ पर उस छोटे डाउन-एरो पर क्लिक करके ऐड-बटन का विस्तार करें
  • बटन ड्रॉप डाउन सूची में "Add As Link" चुनें

पुराने असेंबली Info.cs फ़ाइल (s) को आसपास रखने का उद्देश्य क्या है? जब मैं GlobalAssemblyInfo.cs में अपना बिल्ड संस्करण स्टैम्प स्वचालित करता हूं, तो असेंबली Info.cs फ़ाइल (अपडेट) को मेरे समाधान में कैसे अपडेट किया जाता है?
३२ वीरवित्र ०

3
@Devtron अलग-अलग असेंबलीइन्फो फ़ाइलों को असेंबली के लिए अद्वितीय जानकारी प्रदान करनी चाहिए जो वे (जैसे शीर्षक, विवरण और संस्कृति में रहते हैं, जैसा कि ऊपर दिए गए उदाहरण में है)। आम प्रविष्टियों, जैसे कि उत्पाद का नाम और संस्करण जानकारी को हटा दिया जाना चाहिए (और यदि वे डुप्लिकेट हैं तो संकलक त्रुटि का कारण होगा)। आदर्श रूप में, असेम्बलीइन्फो फाइल्स को बिल्ड प्रोसेस द्वारा अपडेट नहीं किया जाएगा।
डेविड कीवेनी

1
AssemblyCultureAttributeएक बेहतर विवरण के योग्य है। विशेषता को पूरी तरह से अनुपस्थित होना चाहिए (जब तक कि यह एक उपग्रह विधानसभा नहीं है)। जब बड़े पैमाने पर उपग्रहों की विधानसभाओं का उपयोग किया जाता है, तो किसी को तीन की आवश्यकता हो सकती है, न कि असेंबली इंफ़ॉर्मेशन फ़ाइलों के दो स्तरों (वैश्विक, मुख्य असेंबली, और सैटेलाइट असेंबली जो केवल इस मामले में संस्कृति को निर्दिष्ट करती हैं)।
जिरका हनिका

20

मेरे मामले में, हम एक उत्पाद का निर्माण कर रहे हैं जिसके लिए हमारे पास अपनी परियोजनाओं में विभिन्न घटकों के साथ एक विजुअल स्टूडियो समाधान है। सामान्य गुण चलते हैं। समाधान में, लगभग 35 परियोजनाएँ हैं, और एक आम सभा की जानकारी (CommonAssemblyInfo.cs) है, जिसमें निम्नलिखित हैं:

[assembly: AssemblyCompany("Company")]
[assembly: AssemblyProduct("Product Name")]
[assembly: AssemblyCopyright("Copyright © 2007 Company")]
[assembly: AssemblyTrademark("Company")]

//This shows up as Product Version in Windows Explorer
//We make this the same for all files in a particular product version. And increment it globally for all projects.
//We then use this as the Product Version in installers as well (for example built using Wix).
[assembly: AssemblyInformationalVersion("0.9.2.0")]

अन्य गुण जैसे कि असेंबलीटाइल, असेंबली वर्जन आदि, हम प्रति-विधानसभा आधार पर आपूर्ति करते हैं। असेंबली बनाते समय दोनों असेंबली में InIn.cs और CommonAssemblyInfo.cs का निर्माण किया जाता है। यह हमें दोनों दुनियाओं में सर्वश्रेष्ठ देता है जहां आप सभी परियोजनाओं के लिए कुछ सामान्य विशेषताओं और कुछ अन्य लोगों के लिए विशिष्ट मूल्य रखना चाह सकते हैं।

उम्मीद है की वो मदद करदे।


क्या आपके पास इसे बनाने के लिए आपके बिल्ड कॉन्फ़िगरेशन में 35+ प्रविष्टियाँ हैं? बल्कि बेमानी लगता है। यदि आप 2 या 3 नई परियोजनाएँ जोड़ते हैं, तो क्या यह आपके निर्माण को तोड़ता है जब तक कि आप उन्हें वर्जनिंग कार्य में नहीं जोड़ते?
D3vtr0n

1
@ D3vtr0n, एक "कॉन्फ़िगरेशन का निर्माण क्यों करेगा" (आपको इससे क्या मतलब है) इतनी सारी प्रविष्टियों की आवश्यकता है? मुझे लगता है कि यह फ़ाइल प्रत्येक .csproj के माध्यम से <Compile Include="$(MSBuildThisFileDirectory)..\Common\CommonAssemblyInfo.cs"/>, एक MSBuild निर्देश में शामिल है जो एक साझा Common.targetsफ़ाइल में भी हो सकती है । याय कोड पुन: उपयोग
बिंकी जू

15

@JRoppert द्वारा प्रस्तुत समाधान लगभग वही है जो मैं करता हूं। अंतर केवल इतना है कि मैंने स्थानीय असेंबली में निम्न पंक्तियाँ लगाई हैं। फाइल में प्रत्येक विधानसभा के साथ भिन्न हो सकते हैं:

#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif
[assembly: AssemblyVersion("This is set by build process")]
[assembly: AssemblyFileVersion("This is set by build process")]
[assembly: CLSCompliant(true)]

मैं भी (आम तौर पर) प्रति समाधान एक आम सभा जानकारी का उपयोग करता हूं, इस धारणा के साथ कि एक समाधान एक एकल उत्पाद लाइन / भरोसेमंद उत्पाद है। आम असेंबली जानकारी फ़ाइल में भी है:

[assembly: AssemblyInformationalVersion("0.9.2.0")]

जो Windows Explorer द्वारा प्रदर्शित "ProductVersion" मान सेट करेगा।


8

MSBuild कम्यूनिटी टास्क में असेंबली इनफो नामक एक कस्टम टास्क होता है, जिसका उपयोग आप अपनी असेंबली में कर सकते हैं। इसे उपयोग करने के लिए आपकी csproj फ़ाइलों का थोड़ा हाथ से संपादन आवश्यक है, लेकिन यह सार्थक है।


6

GlobalAssemblyInfo.cs का उपयोग करने के बारे में मेरी राय में यह मूल्य से अधिक परेशानी है, क्योंकि आपको प्रत्येक प्रोजेक्ट फ़ाइल को संशोधित करने और प्रत्येक नई परियोजना को संशोधित करने की याद है, जबकि आपको डिफ़ॉल्ट रूप से एक असेंबलीइन्फो.केक्स मिलते हैं।

वैश्विक मूल्यों (यानी कंपनी, उत्पाद आदि) में बदलाव के लिए आमतौर पर बदलाव इतने सरल और सरल होते हैं कि मुझे यह नहीं लगता कि DRY एक विचार होना चाहिए। निम्नलिखित MSBuild स्क्रिप्ट ( MSBuild एक्सटेंशन पैक पर निर्भर ) चलाने के लिए जब आप मैन्युअल रूप से सभी प्रोजेक्ट में मान को एक-ऑफ़ के रूप में बदलना चाहते हैं:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="UpdateAssemblyInfo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <ItemGroup>
        <AllAssemblyInfoFiles Include="..\**\AssemblyInfo.cs" />
    </ItemGroup>

    <Import Project="MSBuild.ExtensionPack.tasks" />

  <Target Name="UpdateAssemblyInfo">
    <Message Text="%(AllAssemblyInfoFiles.FullPath)" />
    <MSBuild.ExtensionPack.Framework.AssemblyInfo 
        AssemblyInfoFiles="@(AllAssemblyInfoFiles)"
        AssemblyCompany="Company"
        AssemblyProduct="Product"
        AssemblyCopyright="Copyright"
        ... etc ...
        />
  </Target>

</Project>

3

कई परियोजनाओं के बीच एक फ़ाइल साझा करने के लिए आप एक लिंक के रूप में एक मौजूदा फ़ाइल जोड़ सकते हैं।

ऐसा करने के लिए, एक मौजूदा फ़ाइल जोड़ें, और फ़ाइल चयनकर्ता में "लिंक के रूप में जोड़ें" पर क्लिक करें। (स्रोत: free.fr )लिंक के रूप में जोड़ें

साझा फ़ाइल में क्या रखा जाए, इसके लिए मैं उन चीजों को डालने का सुझाव दूंगा जो असेंबली में साझा की जाएंगी। कॉपीराइट, कंपनी, शायद संस्करण जैसी चीजें।


1

एक से अधिक प्रोजेक्ट्स के लिए AseemblyInfo.cs फ़ाइल का उपयोग करने की अनुशंसा नहीं की जाती है। असेम्बलीइन्फो फाइल में वह जानकारी शामिल है जो केवल उस विशिष्ट सभा के लिए प्रासंगिक हो सकती है। जानकारी के दो सबसे स्पष्ट टुकड़े हैं AssemblyTitleऔर AssemblyVersion

एक बेहतर समाधान targetsफ़ाइल का उपयोग करने के लिए हो सकता है , जिसे एक परियोजना के लिए एक से अधिक प्रोजेक्ट्स को "इंजेक्ट" करने के लिए MSBuild द्वारा नियंत्रित किया जाता है।


क्या होगा यदि आपके पास 20+ प्रोजेक्ट हैं? मुझे वर्ज़निंग के लिए अपने बिल्ड कॉन्फ़िगरेशन में 20+ प्रविष्टियाँ बनाए रखने की आवश्यकता है। यह वास्तव में लंगड़ा लगता है। यदि मैं 2 या 3 नई परियोजनाएँ जोड़ूँ तो क्या होगा? यह निश्चित रूप से निर्माण प्रक्रिया को तोड़ देगा ... किसी भी विचार को कैसे हल किया जाए?
३३:०43

@ D3vtr0n मुझे लगता है कि विचार प्रासंगिक विधानसभा को गतिशील रूप से उत्पन्न करने के लिए है और प्रत्येक परियोजना के लिए व्यक्तिगत कॉन्फ़िगरेशन को बनाए रखने के लिए नहीं है। सामुदायिक कार्य, मुझे लगता है, उस मामले को संभालता है।
रोमन

1

एक चीज जो मुझे उपयोगी लगी है वह है प्री-बिल्ड चरण में टोकन-प्रतिस्थापन को लागू करके असेंबली वर्जन तत्वों (आदि) को उत्पन्न करना।

मैं TortoiseSVN उपयोग करते हैं, और वह अपने उपयोग में आसान है SubWCRev.exeएक टेम्पलेट चालू करने के लिए AssemblyInfo.wcrevमें AssemblyInfo.cs। टेम्पलेट में संबंधित लाइन कुछ इस तरह दिख सकती है:

[assembly: AssemblyVersion("2.3.$WCREV$.$WCMODS?1:0$$WCUNVER?1:0$")]

तीसरा तत्व फिर संशोधन संख्या है। मैं जाँचने के लिए चौथे तत्व का उपयोग करता हूँ मैं कोई भी नई या बदली हुई फाइल करना नहीं भूलता (चौथा तत्व 00 है अगर यह सब ठीक है)।

वैसे, AssemblyInfo.wcrevअपने संस्करण नियंत्रण में जोड़ें और यदि आप इसका उपयोग करते हैं AssemblyInfo.cs तो उपेक्षा करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.