2012-08-30 3 views
19

मेरी Defines.wxi में मैं शामिल करें:MajorVersion आदि फ़ाइल नाम में (OutputName) (wix परियोजना) MSI फ़ाइल का निर्माण जब

<?define MajorVersion="1" ?> 
<?define MinorVersion="08" ?> 
<?define BuildVersion="11" ?> 

मेरी MyProject.Setup.wixproj में मेरे पास है:

<OutputName>MyProject</OutputName> 
<OutputType>Package</OutputType> 

क्या किसी भी तरह फ़ाइल नाम में संस्करण चर शामिल करना संभव है, ताकि मेरी फ़ाइल को MyProject.1.08.11.msi नाम दिया जा सके?

यह काम नहीं किया है (जैसे कि कोई चर परिभाषित किया गया है):

<OutputName>MyProject-$(MajorVersion)</OutputName> 
<OutputType>Package</OutputType> 

यह काम नहीं किया है (जैसे कि कोई चर परिभाषित किया गया है):

<Target Name="AfterBuild" Condition="'$(Configuration)' == 'Release'"> 
    <Copy SourceFiles="$(OutputPath)$(OutputName).msi" DestinationFiles="C:\$(OutputName)-$(MajorVersion).msi" /> 
</Target> 

यह मेरे लिए बहुत स्पष्ट लगता है कि $ (MajorVersion) Defines.wxi फ़ाइल से परिभाषा लाने का सही तरीका नहीं है। क्या है? Defines.wxi में

<InstallerMajorVersion>7</InstallerMajorVersion> 
<InstallerMinorVersion>7</InstallerMinorVersion> 
<InstallerBuildNumber>7</InstallerBuildNumber> 

...

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> 
    <OutputPath>bin\$(Configuration)\</OutputPath> 
    <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath> 
    <DefineConstants>PrebuildPath=..\..\obj\prebuild\web\;InstallerMajorVersion=$(InstallerMajorVersion);InstallerMinorVersion=$(InstallerMinorVersion);InstallerBuildNumber=$(InstallerBuildNumber)</DefineConstants> 
</PropertyGroup> 

और यह:


अद्यतन

मैं MyProject.Setup.wixproj में इस डालने की कोशिश की:

<?define MajorVersion="$(var.InstallerMajorVersion)" ?> 
<?define MinorVersion="$(var.InstallerMinorVersion)" ?> 
<?define BuildVersion="$(var.InstallerBuildNumber)" ?> 
<?define Revision="0" ?> 
<?define VersionNumber="$(var.InstallerMajorVersion).$(var.InstallerMinorVersion).$(var.InstallerBuildNumber)" ?> 

या तो काम नहीं किया। इन त्रुटि संदेशों को मिला:

  • उत्पाद/@ संस्करण विशेषता का मान, '..' मान्य संस्करण नहीं है। कानूनी संस्करण मान 'x.x.x.x' जैसा दिखना चाहिए जहां x 0 से 35534 से 0 पूर्णांक है।
  • उत्पाद/@ संस्करण विशेषता नहीं मिली; यह आवश्यक है।

उत्तर

12

यह है कि मैं क्या साथ समाप्त हो गया है, और यह काम करता है!

Setup.Version.proj

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
     <InstallerMajorVersion>55</InstallerMajorVersion> 
     <InstallerMinorVersion>66</InstallerMinorVersion> 
    <InstallerBuildVersion>$(BuildNumber)</InstallerBuildVersion> 
     <InstallerBuildVersion Condition="$(InstallerBuildVersion) == ''">0</InstallerBuildVersion> 
    </PropertyGroup> 
</Project> 

MyProject.Setup.wixproj

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Import Project="Setup.Version.proj" /> 
    <PropertyGroup> 
    <OutputName>MyProject_$(InstallerMajorVersion)_$(InstallerMinorVersion)_$(InstallerBuildVersion)</OutputName> 
    <OutputType>Package</OutputType> 
    <DefineConstants>InstallerMajorVersion=$(InstallerMajorVersion);InstallerMinorVersion=$(InstallerMinorVersion);InstallerBuildVersion=$(InstallerBuildVersion)</DefineConstants> 
    ... 

Defines.wxi

<?define MajorVersion="$(var.InstallerMajorVersion)" ?> 
<?define MinorVersion="$(var.InstallerMinorVersion)" ?> 
<?define BuildVersion="$(var.InstallerBuildVersion)" ?> 
+1

तो ... बहुत कोशिश करने के बाद, मैंने पाया कि यह वर्णन के अनुसार काम करता है, इसके अलावा ** defines.wxi ** आवश्यक नहीं है। हालांकि मैं थोड़ी देर के लिए अटक गया था क्योंकि मैंने वेब से '' बिट कॉपी-पेस्ट किया था, और किसी भी तरह एक विशेष चरित्र था या कुछ वीएस स्वीकार नहीं किया था - मुझे हमेशा 'var.InstallerMajorVersion नहीं मिला' त्रुटि मिली । सब के बाद यह महान काम करता है, imho वास्तव में सुरुचिपूर्ण समाधान! –

+0

ने अभी एक और संभावित त्रुटि की पहचान की है: आप यह सुनिश्चित करना चाहते हैं कि '' टैग किसी अन्य 'PropertyGroup' में परिभाषित नहीं है, अन्यथा आपको' var.InstallerMajorVersion नहीं मिला 'त्रुटि मिलती है। –

4

एक तरीका आपके एमएसबिल्ड स्क्रिप्ट में चर को परिभाषित करना होगा, और इसे this example में बिल्ड समय पर Defines.wxi अद्यतन करना होगा।

अपने MSBuild स्क्रिप्ट में, आप संस्करण गुणों को निम्नानुसार निर्धारित कर सकते हैं:

<PropertyGroup> 
    <MajorVersion>1</MajorVersion> 
    <MinorVersion>08</MinorVersion> 
    <BuildVersion>11</BuildVersion> 
    <WixConfigPath>.\Defines.wxi</WixConfigPath> 

    <_VariableDefinitions> 
     <Root> 
     <VariableDefinition Name="MajorVersion" NewValue="$(MajorVersion)" /> 
     <VariableDefinition Name="MinorVersion" NewValue="$(MinorVersion)" /> 
     <VariableDefinition Name="BuildVersion" NewValue="$(BuildVersion)" /> 
     </Root> 
    </_VariableDefinitions> 
    </PropertyGroup> 

    <Target Name="UpdateWixVars"> 
    <WixVarSubstitution SourceFile="$(WixConfigPath)" VariableDefinitions="$(_VariableDefinitions)"/> 
    </Target> 

फिर UpdateWixVars लक्ष्य चल संस्करण संख्याओं अपने MSBuild परियोजना में निर्दिष्ट के साथ Defines.wxi में संस्करण संख्याओं अद्यतन करेगा।

  1. डाउनलोड स्रोत from here:

    ध्यान दें कि मैं इस कस्टम निर्माण कार्य के साथ एक वास्तविक संकलित dll नहीं पा सके, तो मैं द्वारा उसे बनाने के लिए किया था। इसे बनाएं और फ़ाइल Tranxition.BuildTasks.dll नाम दें।

  2. तो जैसे निर्माण कार्य के संदर्भ में जोड़ें:

    <UsingTask TaskName="WixVarSubstitution" 
        AssemblyFile="$(MSBuildExtensionsPath)\Tranxition\Tranxition.BuildTasks.dll"/> 
    
+0

अपने जवाब के लिए धन्यवाद। Tranxition का उपयोग किए बिना इसे ठीक करना पसंद करेंगे। मैंने अपने प्रश्नों को अपने नवीनतम प्रयास के साथ अपडेट किया जो कुछ हद तक समान है। क्या आपके पास कोई इनपुट है? –

+0

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

4

यह .wixproj फ़ाइल से .wxi फ़ाइल को पढ़ने के लिए संभव नहीं है। इसलिए आपको संस्करण निर्दिष्ट करने के लिए एक और तरीका उपयोग करना होगा। मैं एक उदाहरण दे सकता हूं जहां मैंने इंस्टॉलर में शामिल असेंबली से संस्करण पढ़ा है, और उस संस्करण का उपयोग एमएसआई का नाम बदलने के लिए किया है;

खुला एक संपादक में .wixproj फाइल और एक ReadVersion लक्ष्य जोड़ें:

<Target Name="ReadVersion"> 
    <GetAssemblyIdentity AssemblyFiles="bin\program.exe"> 
     <Output TaskParameter="Assemblies" ItemName="MyAssemblyIdentities" /> 
    </GetAssemblyIdentity> 
    <Message Text="AssemblyVersion = %(MyAssemblyIdentities.Version)" /> 
    <CreateProperty Value="$(TargetName) %(MyAssemblyIdentities.Version)"> 
     <Output TaskParameter="Value" PropertyName="TargetName" /> 
    </CreateProperty> 
    <CreateProperty Value="$(TargetName)$(TargetExt)"> 
     <Output TaskParameter="Value" PropertyName="TargetFileName" /> 
    </CreateProperty> 
    <CreateProperty Value="$(OutDir)$(TargetFileName)"> 
     <Output TaskParameter="Value" PropertyName="TargetPath" /> 
    </CreateProperty> 
    </Target> 

यह bin\program.exe से संस्करण में लिखा है, डिबगिंग उद्देश्यों के लिए यह प्रदर्शित करता है, और बदल जाता टार्गेटनाम, TargetFileName और TargetPath।

<Import Project="$(WixTargetsPath)" /> युक्त लाइन के बाद, जोड़ने के निर्माण प्रक्रिया में इस लक्ष्य को इंजेक्षन करने के लिए निम्न:

<PropertyGroup> 
    <BuildDependsOn>ReadVersion;$(BuildDependsOn)</BuildDependsOn> 
    </PropertyGroup> 
+0

मैंने अपने प्रश्न को अपने नवीनतम प्रयास के साथ अपडेट किया। यह अब स्पष्ट हो सकता है। –

+0

फिर आपको wixproj 'PropertyGroup' में 'DefineConstants' का उपयोग करना होगा, http://stackoverflow.com/a/627279/33499 – wimh

+0

हां मैंने इसे भी किया है, इसे अभी चिपकाया है। मुझे सही लग रहा है, लेकिन फिर भी यह त्रुटि –

4

आपकी .wixproj फ़ाइल में। </Project> टैग से पहले निम्न अनुभाग जोड़ें।

<!-- rename the output msi with Version number --> 
    <Target Name="AfterBuild"> 
    <GetAssemblyIdentity AssemblyFiles="[Path of the main assembly with the assembly version number you want to use]"> 
     <Output TaskParameter="Assemblies" ItemName="AssemblyVersion"/> 
    </GetAssemblyIdentity> 
    <Copy SourceFiles=".\bin\$(Configuration)\$(OutputName).msi" DestinationFiles=".\bin\$(Configuration)\$(OutputName)_%(AssemblyVersion.Version).msi" /> 
    <Delete Files=".\bin\$(Configuration)\$(OutputName).msi" /> 
    </Target> 

यह मेरे लिए काम करता है।

8

यह सामान्य कार्य WiX के भविष्य के संस्करणों में सरलीकृत होना चाहिए!

यह समाधान @ विममेल और this post को जोड़ता है। यह एक लक्ष्य .exe से संस्करण खींचता है, और अन्यथा संस्करण संख्याओं को फ़ाइलों में संग्रहीत नहीं करता है; यह पोस्ट-बिल्ड में आउटपुट फ़ाइल का नाम नहीं बदलता है। लेकिन, प्रॉपर्टीडिफिन कॉन्स्टेंट्स को अपडेट करना जरूरी है, जिससे मोमबत्ती के तर्क प्राप्त किए गए हैं (wix.targets में)। अन्यथा, केवल लक्ष्यपैथ संपत्ति को अद्यतन करने से इनपुट को candle.exe में परिवर्तित नहीं किया जाता है।

* .wixproj:

<Import Project="$(WixTargetsPath)" /> 
<Target Name="BeforeBuild"> 
    <!-- Read the version from the to-be-installed .exe --> 
    <GetAssemblyIdentity AssemblyFiles="path.to.primary.exe"> 
    <Output TaskParameter="Assemblies" ItemName="AsmInfo" /> 
    </GetAssemblyIdentity> 

    <!-- Create the MSBuild property $(VersionNumber) --> 
    <CreateProperty Value="%(AsmInfo.Version)"> 
    <Output TaskParameter="Value" PropertyName="VersionNumber" /> 
    </CreateProperty> 

    <!-- Create the WiX preprocessor variable $(var.VersionNumber) --> 
    <CreateProperty Value="$(DefineConstants);VersionNumber=$(VersionNumber)"> 
    <Output TaskParameter="Value" PropertyName="DefineConstants" /> 
    </CreateProperty> 

    <!-- Update the MSBuild properties $(TargetName), etc. --> 
    <CreateProperty Value="$(SolutionName)-$(Platform)-$(VersionNumber)"> 
    <Output TaskParameter="Value" PropertyName="TargetName" /> 
    </CreateProperty> 
    <CreateProperty Value="$(TargetName)$(TargetExt)"> 
    <Output TaskParameter="Value" PropertyName="TargetFileName" /> 
    </CreateProperty> 
    <CreateProperty Value="$(TargetName)$(TargetPdbExt)"> 
    <Output TaskParameter="Value" PropertyName="TargetPdbName" /> 
    </CreateProperty> 
    <CreateProperty Value="$(TargetDir)$(TargetFileName)"> 
    <Output TaskParameter="Value" PropertyName="TargetPath" /> 
    </CreateProperty> 
    <CreateProperty Value="$(TargetPdbDir)$(TargetPdbName)"> 
    <Output TaskParameter="Value" PropertyName="TargetPdbPath" /> 
    </CreateProperty> 

    <!-- Update the MSBuild property from which candle.exe args are derived --> 
    <CreateProperty Value=" 
    Configuration=$(ConfigurationName); 
    OutDir=$(OutDir); 
    Platform=$(PlatformName); 
    ProjectDir=$(ProjectDir); 
    ProjectExt=$(ProjectExt); 
    ProjectFileName=$(ProjectFileName); 
    ProjectName=$(ProjectName); 
    ProjectPath=$(ProjectPath); 
    TargetDir=$(TargetDir); 
    TargetExt=$(TargetExt); 
    TargetFileName=$(TargetFileName); 
    TargetName=$(TargetName); 
    TargetPath=$(TargetPath); 
    "> 
    <Output TaskParameter="Value" PropertyName="ProjectDefineConstants" /> 
    </CreateProperty> 
</Target> 

*।wxs

<Product Id="*" Version="$(var.VersionNumber)" ... > 
    ... 
</Product> 
+0

उत्कृष्ट। यहां सबसे अच्छा समाधान। –

+0

ऐसा मत करो! http://wixtoolset.org/issues/4555/ – l33t

1

आप मूल इन दो जवाब को लागू करने से यह पूरा कर सकते हैं:

  • सबसे पहले, अपने प्रोजेक्ट की AfterBuild WIX निर्मित एमएसआई का नाम बदलने का कार्य अद्यतन: https://stackoverflow.com/a/10716409/374198
  • फिर, अपने WIX अद्यतन प्रोजेक्ट जो आप पैकेजिंग कर रहे हैं उसकी स्वचालित संख्या का उपयोग करने के लिए प्रोजेक्ट: https://stackoverflow.com/a/641094/374198

अन्य उत्तरों बहुत जटिल हैं!

पुनश्च: यदि आपको चौथे अंकों ड्रॉप करने, अर्थ संस्करण निम्नलिखित चाहते हैं, आप इसे इस तरह कर सकते हैं:

<Target Name="AfterBuild"> 
    <GetAssemblyIdentity AssemblyFiles="..\Path\To\MyProject\bin\$(Platform)\$(Configuration)\MyProject.dll"> 
     <Output TaskParameter="Assemblies" ItemName="AssemblyInfo" /> 
    </GetAssemblyIdentity> 
    <PropertyGroup> 
     <In>%(AssemblyInfo.Version)</In> 
     <Pattern>^(\d+.\d+.\d+)</Pattern> 
     <AssemblyVersion>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern)))</AssemblyVersion> 
    </PropertyGroup> 
    <Move SourceFiles="bin\$(Platform)\$(Configuration)\MyProject.msi" DestinationFiles="bin\$(Platform)\$(Configuration)\CodeGenerator-$(AssemblyVersion).$(Platform).msi" /> 
</Target> 

यह एक MSI नाम है, उदाहरण के लिए, MyProject-1.2.3.x64.msi पैदा करेगा। अधिक के लिए this answer देखें।

0

यह एक wixproj फ़ाइल का एक पूर्ण उदाहरण है जहां आप UI में संस्करण संख्या सेट कर सकते हैं और आउटपुट एमएसआई फ़ाइल नाम को संशोधित करने के लिए इसका उपयोग कर सकते हैं।

दृश्य स्टूडियो (जैसे 2015) में:

  • परियोजना गुण विंडो में "पूर्वप्रक्रमक चर परिभाषित करें" में एक संस्करण संख्या निर्धारित करते हैं। मैंने इस उदाहरण के लिए VersionNumber = 1.14 दर्ज किया है;
  • समाधान प्रोजेक्टर में अपनी प्रोजेक्ट को अनलोड करें;
  • समाधान एक्सप्लोरर में अपनी प्रोजेक्ट पर राइट क्लिक करें और yourproject.wixproj फ़ाइल संपादित करें का चयन करें;
  • नीचे दिखाए गए लक्ष्य नाम = "पहले बिल्ड" तत्व में कोड जोड़ें।

    <?xml version="1.0" encoding="utf-8"?> 
    <Project ToolsVersion="4.0" DefaultTargets="Build" InitialTargets="EnsureWixToolsetInstalled" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
        <PropertyGroup> 
        <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 
        <Platform Condition=" '$(Platform)' == '' ">x86</Platform> 
        <ProductVersion>3.10</ProductVersion> 
        <ProjectGuid>PROJECT-GUID</ProjectGuid> 
        <SchemaVersion>2.0</SchemaVersion> 
        <OutputName>my project</OutputName> 
        <OutputType>Package</OutputType> 
        </PropertyGroup> 
        <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> 
        <OutputPath>bin\$(Configuration)\</OutputPath> 
        <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath> 
        <!-- These constants can be set in the UI --> 
        <DefineConstants>VersionNumber=1.14</DefineConstants> 
        </PropertyGroup> 
        <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> 
        <OutputPath>bin\$(Configuration)\</OutputPath> 
        <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath> 
        <DefineConstants>VersionNumber=1.14</DefineConstants> 
        </PropertyGroup> 
        <ItemGroup> 
        <Compile Include="Product.wxs" /> 
        </ItemGroup> 
        <ItemGroup> 
        <WixExtension Include="WixUIExtension"> 
         <HintPath>$(WixExtDir)\WixUIExtension.dll</HintPath> 
         <Name>WixUIExtension</Name> 
        </WixExtension> 
        </ItemGroup> 
        <Import Project="$(WixTargetsPath)" Condition=" '$(WixTargetsPath)' != '' " /> 
        <Import Project="$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets" Condition=" '$(WixTargetsPath)' == '' AND Exists('$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets') " /> 
    
        <Target Name="BeforeBuild"> 
        <!-- This extracts the version number from a setting in the UI --> 
        <!-- This method comes from: geekswithblogs.net/alexhildyard/archive/2013/03/09/passing-data-between-msbuild-and-wix.aspx --> 
        <ItemGroup> 
         <DefineConstantsKVPairs Include="$(DefineConstants)" /> 
        </ItemGroup> 
        <!-- Evaluate each key/value pair with task batching, then make a conditional assignment --> 
        <PropertyGroup> 
         <VersionNumber Condition="$([System.String]::new('%(DefineConstantsKVPairs.Identity)').Contains('VersionNumber='))">$([System.String]::new('%(DefineConstantsKVPairs.Identity)').Split('=')[1])</VersionNumber> 
        </PropertyGroup> 
    
        <CreateProperty Value="$(OutputName)-$(VersionNumber)"> 
         <Output TaskParameter="Value" PropertyName="TargetName" /> 
        </CreateProperty> 
        <CreateProperty Value="$(TargetName)$(TargetExt)"> 
         <Output TaskParameter="Value" PropertyName="TargetFileName" /> 
        </CreateProperty> 
        <CreateProperty Value="$(TargetDir)$(TargetFileName)"> 
         <Output TaskParameter="Value" PropertyName="TargetPath" /> 
        </CreateProperty> 
        </Target> 
    </Project> 
    
संबंधित मुद्दे