Ответ 1
Так как это просто имя файла, почему бы не выполнить действие после сборки, которое переименовывает файл в вашей сборке script (предполагая MSBuild)?
Я хочу включить некоторую динамическую часть в имя файла msi, который производят мои проекты wix. Эта динамическая часть должна управляться переменными, которые являются частью моего проекта wix и объявлены следующим образом:
<?define ProductVersion="7.1.0.1" ?>
Кто-нибудь знает о способе отправки этого значения этой переменной wix в компоновщик, чтобы использовать его как часть имени выходного файла?
Кстати: я использую Wix3
Так как это просто имя файла, почему бы не выполнить действие после сборки, которое переименовывает файл в вашей сборке script (предполагая MSBuild)?
Вы можете обновить OutputName вашего .wixproj и использовать переменную MSBuild для прохождения через номер версии или любую другую переменную, которая вам нравится.
Моя сборка script выглядит следующим образом:
set PRODUCTVERSION=7.1.0.1
MSBuild.exe /p:Configuration=Debug /p:ProductVersion=%PRODUCTVERSION% Installer.wixproj
И мой проект WiX выглядит так:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>1.0.0.0</ProductVersion>
<ProjectGuid>{b7415c44-8d59-4ac2-b698-03e399a305e3}</ProjectGuid>
<SchemaVersion>2.0</SchemaVersion>
<OutputName>Installer.$(ProductVersion)</OutputName>
...
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<OutputPath>bin\$(Configuration)\</OutputPath>
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
<DefineConstants>Debug</DefineConstants>
<WixVariables>ProductVersion=$(ProductVersion)</WixVariables>
</PropertyGroup>
...
</Project>
Вывод будет:
Installer.7.1.0.1.msi
Имя файла msi не определяется вашими файлами wix, а переключателем light.exe -out
. Вы можете использовать одно и то же значение для -out
и внутри ваших файлов wix, если в своей сборке script выполняется следующее: предполагается, что это пакет script:
set
productversion=1.2.3
-out foo%productversion%.msi
в
light.exe
компоновщик$(env.productversion)
Я нашел пару отличных справочных постов, чтобы выполнить только эту операцию:
http://blog.tentaclesoftware.com/archive/2009/05/03/38.aspx
и продолжение с лучшим методом создания выходного файла с использованием события перед сборкой:
http://blog.tentaclesoftware.com/archive/2010/08/05/99.aspx
Я знаю, что ссылки старые, но метод надежный.
Вот основные шаги:
Поместите версию, которую вы хотите использовать, в файл, к которому вы можете получить доступ из вашего проекта. Я использую основной исполняемый файл моей установки, потому что я также привязываюсь к этой версии в моих wxs. В моем случае, так как я собираюсь с помощью С# и использую SVN, у меня есть шаблонная версия моего assembly.cs, assembly.cs.txt, для которого я запускаю subwcrev как событие перед сборкой, чтобы создать файл assembly.cs, который получает скомпилирован в мой исполняемый файл (на самом деле я делаю это в отдельном проекте в моем решении). Subwcrev вставляет некоторую информацию о дате и ревизии, которую я использую для создания версии, в форме "major.minor.version.0", где я использую "year.month.revision.0" для моей версии.
Теперь я обычно просто устанавливаю AssemblyFileVersion с помощью этого метода, но чтобы иметь возможность использовать мой номер версии в событии сборки wixproj, указанном в посте выше, мне также нужно установить AssemblyVersion, поскольку к нему можно получить доступ с помощью GetAssemblyIdentity. Этот метод был бы сомнительным, если бы я действительно использовал сборку, на которую ссылается кто-то другой, но для меня это нормально, так как он находится в моем конечном исполняемом приложении.
Выполните действия, описанные во втором посте (в первом посте обсуждается использование метода привязки для версии в wxs и как выгрузить и отредактировать полезный контекст wixproj для второго поста).
Работает как шарм!
Если у вас есть несколько настроек, чем в файле .wixprj, вы можете сделать следующее
<OutputName Condition="'$(Configuration)' == 'User'">User.Setup</OutputName>
<OutputName Condition="'$(Configuration)' == 'Designer'">Designerr.Setup</OutputName>
Нужно ли определять переменные в WiX? Я создаю свои установочные двоичные файлы из MSBuild, и я просто установил имя выходного файла MyProject_$(Platform)
- я ожидаю, что любая замена переменной MSBuild будет работать одинаково хорошо.
Откройте *.wixproj (пример: Setup.wixproj
)
Перейти в конец файла.
$(Configuration)
= отладка | Релиз …
Установите путь вашего приложения на AssemblyFiles.
<Target Name="BeforeBuild">
<GetAssemblyIdentity AssemblyFiles="..\App\bin\$(Configuration)\App.exe">
<Output TaskParameter="Assemblies" ItemName="AsmInfo" />
</GetAssemblyIdentity>
<CreateProperty Value="$(SolutionName)_%(AsmInfo.Version)_$(Configuration)">
<Output TaskParameter="Value" PropertyName="TargetName" />
</CreateProperty>
</Target>
Выход = App_1.0.0.0_Debug.msi
Product Id="GUID" Name="whatevername $(var.ProductVersion)"