Включить MajorVersion и т.д. В filename (OutputName) при создании файла MSI (проект wix)
В моем Defines.wxi у меня есть:
<?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. Что такое?
Обновление
Я попытался поместить это в MyProject.Setup.wixproj:
<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>
И это в Defines.wxi:
<?define MajorVersion="$(var.InstallerMajorVersion)" ?>
<?define MinorVersion="$(var.InstallerMinorVersion)" ?>
<?define BuildVersion="$(var.InstallerBuildNumber)" ?>
<?define Revision="0" ?>
<?define VersionNumber="$(var.InstallerMajorVersion).$(var.InstallerMinorVersion).$(var.InstallerBuildNumber)" ?>
Не работает. Получили эти сообщения об ошибках:
- Значение атрибута Product/@Version, '..', не является допустимой версией.
Значение юридической версии должно выглядеть так: "x.x.x.x", где x - целое число
от 0 до 65534.
- Атрибут Product/@Version не найден; это
требуется.
Ответы
Ответ 1
Это то, с чем я закончил, и он работает!
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)" ?>
Ответ 2
Эта общая задача должна быть упрощена в будущих версиях WiX!
Это решение объединяет @Wimmel и этот пост. Он извлекает версию из целевого .exe и в противном случае не сохраняет номера версий в файлах; он не переименовывает выходной файл в post-build. Но необходимо обновить свойство ProjectDefineConstants, из которого выводятся аргументы свечи (в wix.targets). В противном случае обновление только свойства TargetPath не изменяет входы на файл 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>
Ответ 3
Один из способов - определить переменные в MSBuild script и обновить Defines.wxi во время сборки, как в в этом примере.
В вашем MSBuild script вы можете определить свойства версии следующим образом:
<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 обновит номера версий в Defines.wxi с номерами версий, указанными в вашем проекте MSBuild.
Обратите внимание, что я не смог найти фактическую скомпилированную dll с этой задачей пользовательской сборки, поэтому мне пришлось ее создать:
Ответ 4
Невозможно прочитать файл .wxi из файла .wixproj. Поэтому вам нужно использовать другой способ для указания версии. Я могу привести пример, когда я прочитал версию из сборки, включенной в программу установки, и использую эту версию для переименования msi;
Откройте файл .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
, отображает ее для целей отладки и изменяет TargetName, TargetFileName и TargetPath.
После строки, содержащей <Import Project="$(WixTargetsPath)" />
, добавьте следующее, чтобы ввести эту цель в процесс сборки:
<PropertyGroup>
<BuildDependsOn>ReadVersion;$(BuildDependsOn)</BuildDependsOn>
</PropertyGroup>
Ответ 5
В вашем файле .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>
Это работает для меня.
Ответ 6
Вы можете выполнить это без проблем, выполнив следующие два ответа:
Другие ответы слишком сложны!
PS: Если вы хотите сбросить четвертую цифру, следуя семантическому управлению версиями, вы можете сделать это следующим образом:
<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
. Подробнее см. .
Ответ 7
Это полный пример файла wixproj, в котором вы можете установить номер версии в пользовательском интерфейсе и использовать это для изменения имени выходного файла msi.
В Visual Studio (например, 2015):
- определить номер версии в разделе "Определение переменных препроцессора" в
окно свойств проекта. Я ввел VersionNumber = 1.14 для этого
Пример;
- выгрузите проект в проводник решений;
- щелкните правой кнопкой мыши ваш проект в проводнике решений и выберите отредактировать файл yourproject.wixproj;
-
добавьте код в элемент Target Name= "BeforeBuild", как показано ниже.
<?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>