2012-09-17 14 views
12

के असेंबली संस्करण के रूप में MSBuild कमांड लाइन के साथ प्रकाशित संस्करण निर्दिष्ट करें मेरे पास एक साधारण बैच फ़ाइल है जो मैं एक डॉस कमांड लाइन से चल रहा हूं जिसका उपयोग एक छोटा सी # अनुप्रयोग बनाने के लिए किया जाता है जो ClickOnce प्रोजेक्ट प्रकाशित करता है। एक पंक्ति यह है:प्रोजेक्ट

msbuild MyApp.csproj /t:publish /property:PublishDir="deploy/" 

यह वर्तमान में आवेदन प्रकाशित करता है, लेकिन यह का उपयोग करता है वर्शन प्रकाशित कि मैं दृश्य स्टूडियो के "प्रकाशन" टैब में स्थापित किया। मैं कमांड लाइन पर प्रकाशित संस्करण सेट करने में सक्षम होने की उम्मीद कर रहा हूं, और विशेष रूप से, मैं प्रोजेक्ट के असेंबली संस्करण का उपयोग करना चाहता हूं। कुछ की तरह:

msbuild MyApp.csproj /t:publish /property:PublishDir="deploy/" /property:PublishVersion="$(Proj.AssemblyVersion)" 

मैं एक कस्टम कार्य बनाने के बिना ऐसा करने के लिए, के बाद से यह सिर्फ एक अंतरिम समाधान है उम्मीद कर रहा हूँ, और मैं बाद में एक और अधिक उचित निर्माण प्रणाली से प्रतिस्थापित कर देगा।

वैकल्पिक रूप से, मैं -Update ध्वज के साथ Mage Command Line Tool उपयोग करते हुए प्रकाशित प्रकट संस्करण का अद्यतन करने को देखा है, लेकिन मैं कैसे PowerShell का उपयोग किए बिना परियोजना से विधानसभा संस्करण संख्या या बनाया विधानसभा पुनः प्राप्त करने या कुछ प्रोग्राम है कि होगा पता नहीं था डाउनलोड करने की आवश्यकता है। अगर मैं कुछ ऐसा उपयोग कर सकता हूं जो विजुअल स्टूडियो के साथ आता है, तो यह भी काम करेगा।

+0

का जवाब है [इस सवाल] (http://stackoverflow.com/questions/1859328/setting-assemblyfileversion-with-msbuild-call) बिल्कुल मदद करो? – adrianbanks

+0

@adrianbanks: यह बैच स्क्रिप्ट में कुछ चर से असेंबली संस्करण सेट करता है। मैं असेंबली संस्करण से तैनाती संस्करण सेट करने की उम्मीद कर रहा हूं (जहां असेंबली संस्करण परियोजना के लिए AssemblyInfo.cs में संग्रहीत है)। –

उत्तर

10

इसे अपनी .csproj फ़ाइल में जोड़ने का प्रयास करें। पहले प्रकाशित लक्ष्य उत्पादन विधानसभा से संस्करण पुनर्प्राप्त करेगा और अद्यतन ApplicationVersion:

<Target Name="BeforePublish"> 
    <GetAssemblyIdentity AssemblyFiles="$(TargetPath)"> 
    <Output TaskParameter="Assemblies" ItemName="fooAssemblyInfo"/> 
    </GetAssemblyIdentity> 
    <PropertyGroup> 
    <ApplicationVersion>%(fooAssemblyInfo.Version)</ApplicationVersion> 
    </PropertyGroup> 
</Target> 

वहाँ शायद एक अच्छे तरह से गतिशील विधानसभा नाम पाने के लिए है, लेकिन अपने उद्देश्य के लिए चाल करना चाहिए। GetAssemblyIdentity वाक्य रचना के लिए यह जवाब देने के लिए

क्रेडिट: https://stackoverflow.com/a/443364/266882

प्रश्नकर्ता संपादित करें:

अद्यतन के लिए नीचे टिप्पणी देखें।

+0

मैं अंत में एक और समाधान (नियमों को थोड़ा बदल रहा) के साथ चला गया, लेकिन ऐसा लगता है जैसे यह मेरा काम नहीं करेगा अगर यह काम नहीं करेगा। धन्यवाद! –

+0

मैं इस पर वापस आया, और यह ठीक तरह से काम नहीं किया जैसा कि मैंने उम्मीद की थी। मेरी आशा थी कि उत्पन्न होने वाले तैनाती मेनिफेस्ट में परिभाषित तैनाती संस्करण होना चाहिए। हालांकि, यह प्रकाशित होने से पहले उत्पन्न होता है।जैसा कि पहले बुलड पर दिखाया गया एक समान कदम करना काम करेगा, लेकिन तब तक असेंबली उपलब्ध नहीं है। मेरा वर्कअराउंड संस्करण में एमएसबिल्ड को कमांड लाइन पर पास करना है, और इसे पहले बिल्डिंग कार्य में उपयोग करना है। –

+1

बिन \ $ (कॉन्फ़िगरेशन) \ WpfAplication1.exe को $ (TargetPath) –

8
msbuild xxx.csproj /target:clean;publish /property:ApplicationVersion=1.2.3.4 
+0

यदि वीएसटीएस का उपयोग कर आप परिवर्तन/प्रतिबद्ध आईडी स्वचालित रूप से संलग्न करने के लिए '/property:AplicationVersion=1.0.0। $ (Build.SourceVersion) 'का उपयोग कर सकते हैं। बेशक आप यहां भी प्रमुख संस्करण कर सकते हैं यदि आप चाहें, लेकिन इसका मतलब है कि एक नए निर्माण में हमेशा एक नया संस्करण होगा और आप हमेशा स्रोत संस्करण पर वापस ट्रैक कर सकते हैं। –

+0

यह आश्चर्यजनक लगता है - पिछले 7 सालों से मैं इसे स्वयं बढ़ा रहा हूं –

9

आदेश सही ढंग से संस्करण तैनाती में घोषित प्रकट के बाद से आवेदन प्रकट निर्माण समय में उत्पन्न होता है आप, बल्कि "BeforePublish" कदम से "AfterCompile" कदम पर ApplicationVersion संशोधित करने की आवश्यकता को अद्यतन करने में। लेकिन फिर आप असेंबली को इंगित करने के लिए $ (TargetPath) प्रॉपर्टी पर भरोसा नहीं कर सकते हैं और इसके बजाय निम्न पथ का उपयोग कर सकते हैं: $ (ProjectDir) obj \ $ (ConfigurationName) \ $ (TargetFileName)

तो यहां अपडेट किया गया है लक्ष्य कोड स्निपेट है कि आप .csproj फ़ाइल को जोड़ सकते हैं:

<Target Name="AfterCompile"> 
    <GetAssemblyIdentity AssemblyFiles="$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)"> 
    <Output TaskParameter="Assemblies" ItemName="AssemblyInfo" /> 
    </GetAssemblyIdentity> 
    <PropertyGroup> 
    <ApplicationVersion>%(AssemblyInfo.Version)</ApplicationVersion> 
    </PropertyGroup> 
</Target> 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^