Подтвердить что ты не робот

WIX: Как настроить динамическое имя файла вывода msi

Я хочу включить некоторую динамическую часть в имя файла msi, который производят мои проекты wix. Эта динамическая часть должна управляться переменными, которые являются частью моего проекта wix и объявлены следующим образом:

<?define ProductVersion="7.1.0.1" ?>

Кто-нибудь знает о способе отправки этого значения этой переменной wix в компоновщик, чтобы использовать его как часть имени выходного файла?

Кстати: я использую Wix3

4b9b3361

Ответ 1

Так как это просто имя файла, почему бы не выполнить действие после сборки, которое переименовывает файл в вашей сборке script (предполагая MSBuild)?

Ответ 2

Вы можете обновить 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

Ответ 3

Имя файла msi не определяется вашими файлами wix, а переключателем light.exe -out. Вы можете использовать одно и то же значение для -out и внутри ваших файлов wix, если в своей сборке script выполняется следующее: предполагается, что это пакет script:

  • установить переменную окружения с помощью set productversion=1.2.3
  • Передать -out foo%productversion%.msi в light.exe компоновщик
  • используйте ту же переменную среды в ваши файлы wix как $(env.productversion)

Ответ 4

Я нашел пару отличных справочных постов, чтобы выполнить только эту операцию:

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 для второго поста).

Работает как шарм!

Ответ 5

Если у вас есть несколько настроек, чем в файле .wixprj, вы можете сделать следующее

<OutputName Condition="'$(Configuration)' == 'User'">User.Setup</OutputName>
<OutputName Condition="'$(Configuration)' == 'Designer'">Designerr.Setup</OutputName>

Ответ 6

Нужно ли определять переменные в WiX? Я создаю свои установочные двоичные файлы из MSBuild, и я просто установил имя выходного файла MyProject_$(Platform) - я ожидаю, что любая замена переменной MSBuild будет работать одинаково хорошо.

Ответ 7

Откройте *.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

Ответ 8

Product Id="GUID" Name="whatevername $(var.ProductVersion)"