Как мне ссылаться на переменную в командной строке, используя light.exe в WiX - PullRequest
0 голосов
/ 23 октября 2019

Я прочитал ссылки, которые, кажется, предлагают возможность ссылаться на переменную bind или WiX в командной строке (эта является наиболее очевидной) . Это дало бы мне возможность добавить информацию о сборке к имени генерируемого MSI. Например,

light.exe ... -out Installer.!(bind.FileVersion.myExe).msi ...
light.exe ... -out Installer.!(wix.BlahInfo).msi ...

Определенно происходит проверка. Если имя WixVariable ID отличается между файлом WXS и ссылкой в ​​команде light.exe, я получаю сообщение об ошибке:

light.exe : error LGHT0197 : The Windows Installer XML variable !(wix.BlahInfo1) is unknown

Если я удостоверяюсь, что они совпадают, то ошибка исчезает:

<WixVariable Id="BlahInfo" Value='!(bind.FileVersion.myExe)'/>
light.exe ... -out Installer.!(wix.BlahInfo).msi ...

Однако, что бы я ни пытался, полученный MSI-файл никогда не заменяет переменную времени выполнения. Вместо этого он просто добавляет! (...) к имени файла. В качестве примера моя последняя сборка создала файл со следующим именем:

Installer.!(wix.BlahInfo).msi

Это что-то, что можно сделать, или я неправильно понял документацию? Спасибо.

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Light не поддерживает ссылки на переменные времени привязки в командной строке.

0 голосов
/ 25 октября 2019

Итак, я пришел к тому же выводу, что и Боб. Это было неприемлемо, поскольку внесло слишком много вариаций в сборки, поэтому я решил это по-другому. Я знал, что исполняемый файл в командной строке может ссылаться на переменную среды Windows во время выполнения. Поэтому все, что мне нужно было сделать, - это установить переменную окружения, сослаться на нее и вуаля:

light.exe ... -out Installer.%BLAH_VERSION%.msi

Чтобы это произошло, нужно было сделать совсем немного. Для начала мой номер версии взят из информации о сборке проекта Visual Studio. Первое, что мне нужно было сделать, это сделать его динамичным, чтобы он создавал новый для каждой сборки. Изменение последних 2 чисел на * сделало это:

[assembly: AssemblyVersion("6.4.*")]

Следующее, что нужно сделать, - это экстернализовать это число, чтобы его можно было использовать в другом месте. Добавление этого раздела в конец csproj сделало следующее:

<Target Name="PostBuildMacros">
  <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
    <Output TaskParameter="Assemblies" ItemName="Targets" />
  </GetAssemblyIdentity>
  <ItemGroup>
    <VersionNumber Include="@(Targets->'%(Version)')"/>
  </ItemGroup>
</Target>
<PropertyGroup>
  <PostBuildEventDependsOn>
    $(PostBuildEventDependsOn);
    PostBuildMacros;
  </PostBuildEventDependsOn>    
  <PostBuildEvent>setx BLAH_VERSION @(VersionNumber)</PostBuildEvent>
</PropertyGroup>

Благодаря этому сообщению stackoverflow за помощь.

Конечно, чтобы ссылаться на него, мне понадобитсячтобы найти способ получить уже открытую командную строку, чтобы обновить ее ссылки на переменную среды. Это оказалось самым сложным, но эта статья о переполнении стека пришла на помощь.

Так что теперь я связал все это вместе с помощью пакетного сценария Windows. По сути, я собираю EXE, проверяю его, проверяю, что он работает хорошо, запускаю свой пакетный скрипт и у меня есть файл MSI, названный в честь созданной для меня версии информации о сборке.

...