6

हमारी दुकान में, हम क्रूज नियंत्रण & उपयोग कर रहे हैं MSBuild निरंतर एकीकरण के भाग के रूप में उत्पाद की बनाता है स्वचालित करने के लिए। निर्माण केआंतरिक प्राप्त करना दृश्यमान काम करने के लिए जब निर्माण प्रक्रिया मजबूत नामों के साथ असेंबली पर हस्ताक्षर करती है?

भाग विधानसभाओं हस्ताक्षर करने के लिए तो वे मजबूत नाम है है।

हमारी परियोजना फाइलों में जब हम स्थानीय स्तर पर विकसित करने, यह के रूप में इस MSBuild स्क्रिप्ट के द्वारा ओवरराइड की गई है, पर हस्ताक्षर निर्दिष्ट नहीं है।

यह तब तक अच्छा और अच्छा है जब तक मैंने फैसला नहीं किया कि मैं यूनिट परीक्षण शुरू करना चाहता हूं जिसके लिए मुझे InternalsVisibleTo विशेषता का उपयोग करने की आवश्यकता है। मैंने एक अच्छी ओपन सोर्स लाइब्रेरी का उपयोग शुरू किया जिसमें यूनिट परीक्षण भी हैं जो इस तकनीक का उपयोग करते हैं।

इसका मतलब है कि, मेरे मशीन पर, मैं निम्नलिखित बयान का उपयोग करने के AssemblyInfo.cs अद्यतन कर सकते हैं:

[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests")] 

और सब कुछ ठीक है।

हालांकि, टूटता में इस जाँच निर्माण के बाद से निर्माण मशीन विधानसभाओं संकेत, कि लाइन से अद्यतन किया जा करने के लिए इस के बजाय की तरह लग रहे करने की आवश्यकता होगी:

[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests, 
      PublicKey="magic key here..)"] 

मैं विधानसभाओं पर हस्ताक्षर नहीं करने के लिए आधा एक मन है और इसे एक दिन बुलाओ। हालांकि, "असेंबली पर हस्ताक्षर करना सबसे अच्छा अभ्यास है" (इस मंत्र को 3 बार दोहराएं), और अगर हमें ऐसा करने से कोई फायदा हो रहा है, तो मैं इसे रिमोट नहीं करना चाहता हूं।

हम जीएसी में स्थापित नहीं हैं, हम विशेष रूप से छेड़छाड़ के बारे में चिंतित नहीं हैं, हमारे पुस्तकालयों का उपयोग करने वाले तीसरे पक्षों के बारे में चिंता करने की ज़रूरत नहीं है, हम ऐप अपडेट करते समय हमारी सभी फाइलें एक बार अपडेट करते हैं। सबसे पहचान योग्य लाभ समर्थन में कोई व्यक्ति किसी असेंबली के कुछ यादृच्छिक संस्करण को रन-टाइम फ़ोल्डर में कॉपी नहीं कर सकता है और कुछ समय के लिए चीजें काम करने लगती हैं।

मैं हस्ताक्षर को सक्षम करने के लिए मैन्युअल रूप से 100 परियोजना फ़ाइलों को बदलने/बदलने के कार्यों को खोलना नहीं चाहता हूं। मैं भी चीजें हैं जो सार्वजनिक रूप में आंतरिक होना चाहिए चिह्नित करके चीजों को हैक नहीं करना चाहते हैं, मैं बाध्यकारी रीडायरेक्ट & मैं इकाई परीक्षण दूर करने के लिए नहीं करना चाहते हैं पाने के लिए नहीं करना चाहती।

मुझे मजबूत नाम रखने के सभी लाभों के साथ मजबूत नाम होने की आसानी नहीं है (यदि कोई है), और मैं इसे करने के लिए बहुत अधिक काम नहीं करना चाहता हूं। क्या यह पूछना बहुत बड़ी बात है?

इस पोस्ट में समस्या और एक समाधान अच्छी तरह का वर्णन करता है, लेकिन मैं एक MSBuild स्क्रिप्ट पुरुष की ज्यादा इसका लाभ उठाने के लिए नहीं कर रहा हूँ:

http://social.msdn.microsoft.com/forums/en-US/msbuild/thread/02df643c-956a-48bd-ac01-4a1016d91032/

इस समस्या का उचित समाधान क्या है?

किसी भी इनपुट और चर्चा के बिंदु स्वागत है।

उत्तर

4

आप संकलन से पहले स्रोत फ़ाइलों में महत्वपूर्ण जानकारी पैच कर सकते हैं।

निम्नलिखित उदाहरण MSBuild Community Tasks से और एक (बहुत कच्चे) regex का उपयोग सी # AssemblyInfo.cs फ़ाइलों में पैच कुंजी जानकारी के लिए करता है।

<ItemGroup> 
    <AssemblyInfoFiles Include="$(MSBuildProjectDirectory)**/AssemblyInfo.cs"/> 
</ItemGroup> 
<FileUpdate 
    Files="@(AssemblyInfoFiles)" 
    Regex='(\[assembly:\s*InternalsVisibleTo\(\"[\w.]*\")(\)\])' 
    ReplacementText='$1, PublicKey="$(StrongNamingPublicKey)"$2' /> 

हालांकि, मैं परियोजनाओं को संशोधित हमेशा मजबूत नाम पर हस्ताक्षर विकास और तैनात वातावरण के बीच एक और अंतर को दूर करने के लिए सफाई घोल होगा लगता है, और आसानी से पटकथा जा सकता है।

+0

धन्यवाद थॉमस, मैं इसे आजमाने के लिए जा रहा हूं और इसे काम करने के बाद इसे उत्तर के रूप में स्वीकार करूँगा। इसे हर जगह मजबूत हस्ताक्षर करने के लिए कुछ मुद्दे हैं, ज्यादातर में मुझे यकीन नहीं है कि उस परिवर्तन को कैसे स्क्रिप्ट करना है और मैं इसे मैन्युअल रूप से नहीं करना चाहता हूं। हमारी मौजूदा बिल्ड स्क्रिप्ट, जिसे किसी ऐसे व्यक्ति द्वारा लिखा गया था जो एमएसबिल्ड को हस्ताक्षर करने से बेहतर जानता है और मैं इसे बड़े बदलाव के बजाय थोड़ा सा ट्विक कर दूंगा। – Wes

+0

मैंने इसे काम करने के लिए कभी नहीं मिला, लेकिन मैं इसे उत्तर के रूप में चिह्नित करूंगा। वह चीज जो काम नहीं करती है वह ContentGfoFiles नामक आइटम समूह है ... यह हमेशा खाली रहेगी ... कोई विचार क्यों? शामिल पैटर्न मूल रूप से आपके द्वारा पोस्ट किया गया है ... धन्यवाद! – Wes

+1

उपरोक्त आइटम समूह यह मानता है कि विधानसभाInfo.cs फ़ाइलों को पैच में निर्माण स्क्रिप्ट के नीचे एक निर्देशिका में स्थित है; '**' वाइल्डकार्ड वर्तमान के नीचे किसी भी निर्देशिका से मेल खाता है। देखें [कैसे करें: बिल्ड करने के लिए फ़ाइलें चुनें] (http://msdn.microsoft.com/en-us/library/ms171454.aspx) MSBuild पर और जानकारी के लिए वाक्यविन्यास शामिल है। –

5

एक ही कंस्ट्रक्शन प्रतीक को परिभाषित करने के लिए डेवलपर बिल्ड पर हस्ताक्षर अक्षम करने के लिए आप उसी निर्माण का उपयोग करें, उदाहरण के लिए। DO_NOT_SIGN, तो, अपने AssemblyInfo.cs में, इस का उपयोग करें:

#if DO_NOT_SIGN 
[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests")] 
#else 
[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests, PublicKey="magic key here..)"] 
#endif 

मेरी निजी राय में यह निर्माण स्क्रिप्ट से स्रोत कोड को संशोधित की तुलना में अधिक सुंदर है।

+0

उत्तर स्कोलिमा के लिए धन्यवाद। मुझे लगता है कि मेरे लिए इस समाधान के लिए मुद्दा यह है कि अब मुझे फाइलों के एक्स # में मैन्युअल रूप से जाना है और इस निर्माण को कई बार इसकी आवश्यकता है, मुझे या दूसरों को नई परियोजनाओं पर ऐसा करना याद रखना है, और थोड़ा सा काम है असंभव घटना में शामिल कुंजी कुंजी बदल जाती है। इसका किसी के लिए दृश्यमान और समझने योग्य होने का लाभ होता है, और एमएसबिल्ड लिपि में एक रहस्य नहीं हुआ, जो हर कोई बहुत अच्छी तरह समझता नहीं है। मुझे लगता है कि मेरे में आलसी प्रोग्रामर w/build स्क्रिप्ट जाने जा रहा है क्योंकि हमारी स्क्रिप्ट में इसके लिए पहले से ही ढांचा है। – Wes