मैं वर्तमान निर्माण संस्करण में वाईएक्स इंस्टॉलर संस्करण कैसे सेट कर सकता हूं?


134

मैंने एक एप्लिकेशन और इसके वाईएक्स इंस्टॉलर को लिखा और तोड़फोड़ का उपयोग करके संस्करण नियंत्रण में रखा। जब वाईएक्स इंस्टॉलर बनाता है तो मैं चाहता हूं कि इसका वर्जन नंबर एप्लीकेशन का करंट बिल्ड वर्जन हो। मैं इसे कैसे पूर्ण करूं? मैंने एप्लिकेशन को कोड करने के लिए c # का उपयोग किया।

NB मैं इस परियोजना के निर्माण के लिए ccnet का उपयोग कर रहा हूं

जवाबों:


181

आप उपयोग कर सकते हैं Product/@Version="!(bind.FileVersion.FileId)"( जिस फ़ाइल से आप संस्करण संख्या प्राप्त करना चाहते हैं, उसके FileIdसाथ बदलें Id) और light.exe फ़ाइल द्वारा संदर्भित फ़ाइल के संस्करण के साथ मान को पॉप्युलेट करेगा FileId


4
मुझे इसकी ही खोज थी! हालांकि मुझे "(" bind.FileVersion.FileId) "(" $ "के बजाय" a! ") का उपयोग करना था, अन्यथा मुझे एक पूर्वप्रक्रमक निर्देशक त्रुटि मिली।
निकोलस पियासेकी

8
हाँ, क्षमा करें, लगातार मानसिक गलती करता हूँ। $ प्रीप्रोसेसर चर है और! बाइंडर चर है।
रोब मेनचिंग

20
ध्यान दें कि "फाइलिड" का मूल्य <File Id = "Fileid" ...> तत्व से होना चाहिए, और जाहिर तौर पर डॉट (।) वर्ण हो सकता है।
जेम्स ह्यूगार्ड James

6
क्या बंडल / बूटस्ट्रैपर के लिए भी ऐसा करना संभव है?
noelicus

6
संबंधित दस्तावेज, अनुभाग के लिए एक लिंक: बाइंडर चर
mcdon

39

मैंने अपनी निष्पादन योग्य फ़ाइल फ़ाइल संस्करण को पढ़ने के लिए एक प्रीप्रोसेसर एक्सटेंशन लिखकर अपनी परियोजनाओं में से एक में किया। तो वाईएक्स फ़ाइल कुछ इस तरह दिखती है:

<?define ProductName="$(fileVersion.ProductName($(var.MyApp.TargetPath)))" ?>
<?define CompanyName="$(fileVersion.CompanyName($(var.MyApp.TargetPath)))" ?>
<?define ProductVersion="$(fileVersion.ProductVersion($(var.MyApp.TargetPath)))" ?>
<Product 
    Id="<product ID>" 
    Name="$(var.ProductName)" 
    Version="$(var.ProductVersion)" 
    Manufacturer="$(var.CompanyName)" 
    Language="1033" 
    UpgradeCode="<upgrade code>">

मैंने CodePlex के लिए कोड पोस्ट किया है: http://wixfileversionext.codeplex.com/


क्या आपका एक्सटेंशन अभी भी काम करता है? मैंने इसे एक संदर्भ के रूप में जोड़ने की कोशिश की और मुझे एक त्रुटि मिली।
स्टेफान वासिलजैविक

इस एक्सटेंशन ने Wix 3.5 के साथ बहुत अच्छा काम किया, Wix 3.9 को अपडेट करने के बाद इसे NullPointerException फेंकता है। जाहिर है कि इन संस्करणों के बीच कुछ टूट गया।
गिगो जूल

2
@ Gigo मैं इसे काम कर रहा हूँ <?define ProductName="!(bind.property.ProductName)" ?><?define CompanyName="!(bind.property.Manufacturer)" ?><?define ProductVersion=!(bind.FileVersion.FileId) ?> जहाँ एक के अंदर अपने तत्वों में से एक की विशेषता का FileIdमूल्य है । IdFileComponent
जारेड

कोडप्लेक्स लिंक मेरे लिए नहीं खुल रहा है। क्या आपके खुद के पूर्व-प्रोसेसर विस्तार को लिखने के अलावा कोई और तरीका है?
आरडीवी

28

यदि कोई व्यक्ति वास्तविक XML उदाहरण की तलाश में है, तो यह .NET असेंबली के साथ काम करता है (और आपको असेंबली या कीपथ विशेषताएँ नहीं करनी हैं)। मैंने असंबंधित कोड को [...] स्थान धारकों के साथ समाप्त कर दिया:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product [...] Version="!(bind.fileVersion.MyDLL)">
        [...]
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder" Name="PFiles">
                <Directory Id="INSTALLDIR" Name="MyDLLInstallLocation">
                    <Component Id="MainLib" Guid="[...]">
                        <File Id="MyDLL" Name="MyDll.dll" Source="MyDll.dll" />
                        [...]
                    </Component>
                    [...]
                </Directory>
            </Directory>
        </Directory>
    </Product>
</Wix>

1
यह एक बेहतर जवाब है। काम करने के उदाहरण के लिए धन्यवाद।
रोल

यह वास्तविक संस्करण संख्या कहां से ला रहा है?
फोब्बर

@foobar जब से मैं यहाँ था थोड़ी देर हो गई है, लेकिन अगर आप स्ट्रिंग को देखते हैं तो !(bind.fileVersion.MyDLL)यह <File Id="MyDLL"...खंड के संदर्भ में 3rd भाग का उपयोग करता है
K0D4

इसने मेरे लिए अच्छा काम किया। संकलित निष्पादनों के साथ-साथ dll का काम करता है जो कि इंस्टॉलर संस्करण और UI सामग्री को
एक्साई

21

यहाँ अपने Bootstrapper बंडल संस्करण का उपयोग कर अपने MyApp AssemblyVersion मिलान करने के लिए प्राप्त करने के लिए एक बहुत ही आसान तरीका है एक BeforeBuild TargetऔरDefineConstants

Bundle.wxs:

<Bundle Name="$(var.ProductName) Bootstrapper v$(var.BuildVersion)"
     Version="$(var.BuildVersion)"

Bootstrapper.wixproj:

<Target Name="BeforeBuild">
  <GetAssemblyIdentity AssemblyFiles="..\MyApp\bin\$(Configuration)\MyApp.exe">
    <Output TaskParameter="Assemblies" ItemName="AssemblyVersion" />
  </GetAssemblyIdentity>
  <PropertyGroup>
    <DefineConstants>BuildVersion=%(AssemblyVersion.Version)</DefineConstants>
  </PropertyGroup>
</Target>

@AliKazmi क्या आपने अपने var.ProductNameऔर var.BuildVersionकहीं अपने को परिभाषित किया है <Bundle>?
ब्रॉक हेंसले

2
मैंने यह कोशिश की और इसे पर्याप्त रूप से अनुशंसित नहीं किया जा सकता - इसे TeamCity के लिए असेंबली पैच के साथ मिलाएं और आपको एक जीत का फॉर्मूला मिल गया है। मैंने बंड तत्व का उपयोग नहीं किया, बल्कि एक उत्पाद तत्व और फिर भी मेरे लिए काम किया।
IbrarMumtaz

वीएस सिर्फ BeforeBuildलक्ष्य को अनदेखा करना पसंद करता है इसलिए AfterTargets="AfterResolveReferences"यदि आप आईडीई में निर्माण कर रहे हैं तो स्पष्ट रूप से निर्दिष्ट करना आवश्यक हो सकता है
दिमित्री

मैंने अपने * .wixproj और Product.wxs फ़ाइल में Bootstrapper.wixproj कोड जोड़ा है, मैंने buildversion वैरिएबल को परिभाषित किया है:
RDV

4

आप अपने सेटअप प्रोजेक्ट के लिए MSBuild स्क्रिप्ट में संस्करण को पास कर सकते हैं, जैसा कि आप एप्लिकेशन की बिल्ड स्क्रिप्ट के लिए पास कर सकते हैं।

उदाहरण के लिए, यदि आपके सीआई प्रणाली चर को परिभाषित करता है AppVersionऔर BuildNumber, और उन्हें अपने MSBuild लिपियों के लिए गुजरता है, अपने wixproj एक इसी बना सकते हैं Versionसंपत्ति जो इसे आगे इस तरह Wix रहे हैं:

<PropertyGroup>
    <Version Condition=" '$(BuildNumber)' == '' ">0.0.1</Version>
    <Version Condition=" '$(BuildNumber)' != '' ">$(AppVersion).$(BuildNumber)</Version>
    <DefineConstants>Version=$(Version)</DefineConstants>
</PropertyGroup>

Versionजब आप स्थानीय स्तर पर निर्माण कर रहे हों, उसके लिए पहली परिभाषा एक डिफ़ॉल्ट प्रदान करती है। जो कुछ भी समाप्त होता है वह Versionविक्स में एक चर बन जाता है । इस तरह से एक wsx फ़ाइल में इसका उपयोग करें:

<Product Version="$(var.Version)" ...>
    <Package Description="$(var.ProductName) $(var.Version): $(var.ProductDescription)" ... />

मुझे विवरण में संस्करण शामिल करना पसंद है ताकि विंडो नाम से स्वतंत्र विंडो एक्सप्लोरर (एक स्तंभ के रूप में विस्तार से या गुण पृष्ठ पर) से दिखना आसान हो।

संस्करण को एक चर के रूप में पास करना आपको फ़ाइल से पढ़ने से अधिक नियंत्रण देता है। जब आप किसी फ़ाइल से पढ़ते हैं, तो आपको प्रोग्रामेटिक संस्करण के सभी 4 भाग मिलते हैं। हालाँकि, ProductVersion केवल पहले 3 भागों का उपयोग करने के लिए डिज़ाइन किया गया है।


धन्यवाद, इससे मेरा दिन बच गया। BTW: ऊपरी कोड स्निप युर प्रोजेक्ट (* .wxiproj) में जाता है। एक Devops / VSTS CI- बिल्ड का प्रबंधन करना यह सबसे अच्छा जवाब है। चूंकि मेरे पास पहले से ही अपना अंतिम संस्करण चर तैयार है। यह मेरे मामले में बदल गया: <Version Condition=" '$(BuildVersionOfAsm)' != '' ">$(BuildVersionOfAsm)</Version>जबकि BuildVersionOfAsm devops पाइपलाइन में एक चर है।
रॉबेटो

मैं संस्करण को गतिशील रूप से चुनना चाहता हूं, इस पद्धति से मुझे * .wixproj में संस्करण को अपडेट करने की आवश्यकता रहेगी। इस क्षेत्र में किसी भी dll के संस्करण के लिए एक रास्ता है?
RDV

@RDV इस दृष्टिकोण के साथ .wixproj सहित स्रोत नियंत्रण में कोई भी फाइल नहीं बदल रहा है। डायनेमिक संस्करण संख्या आपके CI सिस्टम (AppVersion और BuildNumber इस उदाहरण में) द्वारा प्रदान की गई है। आमतौर पर, आप प्रमुख और लघु संस्करण संख्याओं को CI चर के रूप में सेट करते हैं और CI सिस्टम को बिल्ड संख्या को गतिशील रूप से उत्पन्न करते हैं।
एडवर्ड ब्रे

उत्कृष्ट - बस मुझे जिस तरह के समाधान की आवश्यकता थी, जिसमें स्थानीय बिल्ड के लिए डिफ़ॉल्ट भी शामिल है।
कोल्हा

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