Как управлять кодом Bundle с помощью переменных препроцессора?

Я создал несколько конфигураций в своем пакетном проекте в Visual Studio, и я хочу определить, какие фрагменты кода должны быть включены в каждую конфигурацию. Моя цель - получить несколько загрузчиков: некоторые из них будут включать предварительные условия, а некоторые - нет. Я попробовал что-то вроде:

<PackageGroup
       Id="Prerequisites">
      <?if $(Configuration)='Release'?>
      <ExePackage
        Id="Netfx4Client"
        Cache="yes"
        Compressed="yes"
        PerMachine="yes"
        Permanent="yes"
        Vital="yes"
        SourceFile=".\SupportFiles\dotNetFx40_Client_x86_x64.exe"
        DetectCondition="NETFRAMEWORK40CLIENT OR (VersionNT64 AND NETFRAMEWORK40CLIENTX64)"
        InstallCondition="(v4.0.30319 > NETFRAMEWORK40CLIENT OR NOT NETFRAMEWORK40CLIENT)  OR (VersionNT64 AND v4.0.30319 > NETFRAMEWORK40CLIENTX64 OR NOT NETFRAMEWORK40CLIENTX64)"
        InstallCommand="/q /norestart  /log [TempFolder]\dotnetframework4.log"/>
<?endif?>

Но, конечно, это не правильно. Можно ли управлять тем, какие фрагменты кода будут включены в цепочку пакетов пакета в зависимости от какой-либо переменной? Спасибо.

1 ответ

Решение

Да, сначала нужно передать свойство MSBuild препроцессору компилятора. В вашем.wixproj используйте DefineConstants собственность, чтобы туннель собственности через. Стандартный.wixproj, предоставляемый Votive, делает это по умолчанию для Configuration но для других свойств это будет выглядеть так:

<PropertyGroup>
   <DefineConstants>$(DefineConstants);MyNewVariable=$(MSBuildPropertyName)</DefineConstants>
</PropertyGroup>

Теперь, когда свойство MSBuild является переменной препроцессора, вы можете сделать следующее:

<?if $(var.Configuration)="Release" ?>
    Stuff to conditionally compile out
<?endif?>

В принципе, ваш пример выше верен, за исключением того, что вы пропустили var. часть имени переменной препроцессора. Подробнее о синтаксисе препроцессора в документации.

Другие вопросы по тегам