Как мне указать пути к исходным файлам WiX3.5 для работы из проектов без ссылок в рамках моего решения VS2010 - PullRequest
0 голосов
/ 02 ноября 2011

Я долго искал ответа на мой вопрос, касающийся использования Team Build совместно с установщиком WiX3.5 (который полностью установлен в агенте Team Build). В двух словах, моя проблема похожа на многие вопросы форума, но с небольшим поворотом. Чтобы ссылаться на компонент в наших фрагментах Wix, мы используем шаблон:

<Component Id="SomeAssembly.dll" Guid="80C99053-D78C-449C-9645-9031E50FD95F">
    <File Id="SomeAssembly.dll" Source="$(var.MyNamespace.TargetDir)\SomeAssembly.dll" KeyPath="yes"/>
  </Component>

Где переменная $ (var.MyNamespace.TargetDir) автоматически предоставляется механизмом сборки WiX, когда вы используете ссылку на проект в своем проекте WiX. Я отметил, что в моем решении можно использовать ссылки на Проект только там, где начинается моя проблема.

В моем определении построения команды у меня есть ряд решений, которые строятся как часть процесса сборки (на данный момент около 30), так как эти компоненты могут быть использованы для создания ряда других продуктов в одном и том же дереве исходных текстов. , Однако, когда выполняется сборка команды, относительные пути к файлам компонентов изменяются на пути к плоской (ish) файловой структуре, что в вышеприведенном примере хорошо, однако для сборок, на которые ссылаются чисто относительным путем, происходит сбой, так как процесс сборки имеет перенес вывод проекта.

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

Спасибо за ваше время!

1 Ответ

1 голос
/ 06 ноября 2011

В итоге я прибег к решению этой проблемы с помощью одного файла «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>
...