В итоге я прибег к решению этой проблемы с помощью одного файла «Path Variables», который я впоследствии включил во все мои файлы * .wxs, используя директиву препроцессора.
Для проектов, на которые нет прямой ссылки на ссылку проекта в моем проекте WiX, я скопировал то же соглашение об именах для переменных, например,
Namespace.ProjectName.TargetDir
И использовал переменную DevEnvDir, которая определена в сборке Visual Studio в наборе препроцессора if и определяет. Уродство происходит от переменной DevEnvDir, когда она не была официально установлена Team Build, но она устанавливается со значением " Не определено, если не строится из Visual Studio ", что, на мой взгляд, крайне неприятно. Это затрудняет использование подхода.
Мой подход к файлу PathVariables.wxi:
<!-- Safety check for the variable -->
<?ifndef DevEnvDir ?>
<?define IsDesktopBuild = false ?>
<?else?>
<?if $(var.DevEnvDir) = "*Undefined if not building from within Visual Studio*" ?>
<?define IsDesktopBuild = false ?>
<?else?>
<?define IsDesktopBuild = true ?>
<?endif?>
<?endif?>
После чего вам нужно настроить любое из следующих действий следующим образом:
<?if $(var.IsDesktopBuild)=false ?>
<!--Build is TFS2010, default is to the OutDir variable -->
<?define Namespace.Project.TargetDir = "$(var.OutDir)"?>
<?else?>
<!-- Build is Local Build -->
<?define Namespace.Project.TargetDir = C:\LocalFolderPath\Bin\$(var.Configuration)"?>
<?endif?>
Затем в любом из ваших файлов wxs убедитесь, что вы включили:
<?include [PathAsAppropriate]\PathVariables.wxi ?>
Затем вы можете универсально ссылаться на путь к файлу таким же образом, независимо от локальной сборки и Team Build.
<Component Id="Namespace.Project.dll" Guid="*">
<File Id="Namespace.Project.Dll" Source="$(var.Namespace.Project.TargetDir)\Project.dll"/>
</Component>