Установите для свойства Wix местоположение сборки TFS - PullRequest
7 голосов
/ 18 июля 2011

Я пытался найти ответ на свой вопрос и не смог его найти;следовательно, я поставлю решение здесь.Я надеюсь, что это полезно для других.

Проблема:

Я хочу, чтобы мой проект Wix был встроен в процесс сборки TFS 2010.Как часть этого, я хочу, чтобы местоположение исходных файлов для моего Wix указывало на расположение сборки TFS.Например, я хочу, чтобы:

<File Id="ABC" KeyPath="yes" source="C:\Builds\1\MyBuild\assembly.dll" />

было:

<File Id="ABC" KeyPath="yes" source="$(var.TFSLOCATION)\assembly.dll" />

TFSLOCATION - это свойство wix, которое необходимо заполнить местоположением сборки TFS.Это должно произойти во время процесса сборки, когда путь расположения сборки передается в проект Wix.

Решение:

Я прочитал следующую статью:

http://www.ageektrapped.com/blog/setting-properties-for-wix-in-msbuild/

Вот что я сделал с файлом проекта Wix (wixproj):

Чтобы установить свойство wix из процесса TFS MSBuild, файл проекта wix требует два изменения:

<PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <ProductVersion>3.5</ProductVersion>
    <SourceLocation Condition="'$(SourceLocation)' == '' ">UNKNOWN</SourceLocation>
    <ProjectGuid>{cae7e273-2de5-4a60-9c4f-9da5f094caf5}</ProjectGuid>
    <SchemaVersion>2.0</SchemaVersion>
    <OutputName>N4S.MSO.BAM.Installer</OutputName>
    <OutputType>Package</OutputType>
    <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
    <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
    <SccProjectName>SAK</SccProjectName>
    <SccProvider>SAK</SccProvider>
    <SccAuxPath>SAK</SccAuxPath>
    <SccLocalPath>SAK</SccLocalPath>
  </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' "> 
  <OutputPath>bin\$(Configuration)\</OutputPath> 
  <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
  <DefineConstants>LOCATION=$(SourceLocation)</DefineConstants>
</PropertyGroup>

В приведенном выше xml обратите внимание на следующие две строки:

<SourceLocation Condition="'$(SourceLocation)' == '' ">UNKNOWN</SourceLocation>

<DefineConstants>LOCATION=$(SourceLocation)</DefineConstants>

В первой строке указывается свойство SourceLocation и устанавливается значение по умолчанию UNKNOWN., если установлено значение , а не .Вторая строка определяет константу с именем «LOCATION» в конфигурации «Release».Значение этой константы устанавливается равным значению свойства «SourceLocation».

Теперь вам нужно внести следующие изменения в ваш файл Product.wxs (или как бы там ни было имя вашего файла wxs).

  • Сначала определите свойство wix.
<?define TFSLOCATION="$(var.LOCATION)"?>
  • Теперь обновите элементы файла.
<File Id="ABC" KeyPath="yes" source="$(var.TFSLOCATION)\assembly.dll" />

TFSИзменение шаблона сборки 2010

  • Откройте шаблон сборки TFS 2010.
  • Найдите задачу «Запустить MSBuild for Project».
  • Откройте свойства этой задачи иперейдите к свойству 'CommandLineArguments'.
  • Установите для этого свойства значение:
String.Format("/p:SourceLocation={0}", BinariesDirectory)

Done

Теперь у вас есть свойство wix, заполненное из вашей TFSпроцесс сборки.

Ответы [ 3 ]

8 голосов
/ 16 августа 2011

Если вы устанавливаете ссылку в своем файле wixproj на проект (ы), который вы строите, вы можете ссылаться на их целевые пути. Поэтому, если у вас есть два проекта MyProject и MyProjectInstaller, установите ссылку в MyProjectInstaller на MyProject.

Теперь в файле product.wxs ваши элементы File будут выглядеть так:

<File Id='EXE' Name='$(var.MyProject.TargetDir)\MyProject.exe' />
<File Id='DLL' Name='$(var.MyProject.TargetDir)\MyProject.dll' />
...

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

5 голосов
/ 25 июля 2011

Отвечая на вопрос, чтобы он не отображался без ответов, даже если ответ находится в вопросе.

0 голосов
/ 16 мая 2014

В итоге я использовал тот же подход, но с несколькими важными улучшениями.

1) Я передал и SourcesDirectory, и BinariesDirectory из шаблона процесса сборки TFS в MSBuild как отдельные свойства, чтобы у меня был доступ к ним обоим.

2) Чтобы результирующие свойства MSBuild были доступны для каждой задачи, выполняемой в проекте MSBuild, я добавил их в $ (CustomPropertiesForBuild) в цели BeforeBuild.

3) Вместо того, чтобы добавить элемент DefineContants в PropertyGroup, я добавил CreateProperty к цели BeforeBuild.

2 и 3 были выполнены по следующей причине, связанной с запуском нескольких проектных решений Wix в одной сборке TFS. Если вы определили константу, как первоначально предложено, могут произойти две вещи.

Во-первых, если вы запустите heat.exe в своем проекте WiX как часть сборки, в которой есть несколько проектов WiX, может возникнуть проблема, когда DevEnv удерживает дескрипторы процесса, и константа не переопределяется при каждом запуске, пока вы не очистите Выведите папку и отпустите дескриптор файла.

Во-вторых, если по какой-либо причине один из ваших проектов Wix не был собран (конфигурация не указывает его для сборки или указанная конфигурация недействительна для проекта), то по какой-то причине свойство MSBuild сбрасывается в нуль и таким образом, константа переопределяется как ноль, поэтому вы теряете свойство. Если, с другой стороны, вы определяете свойство путем переопределения цели BeforeBuild, все работает правильно.

Обратите внимание, что для корректной работы необходимо переопределить свойство BeforeBuild, а не свойство BeforeEndToEndIteration.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...