Дополнительные пути в скрипте msbuild - PullRequest
3 голосов
/ 11 марта 2011

Как указать дополнительные пути ссылки на сборки для задач MSBuild?

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

<ItemGroup>
 <ProjectsToBuild Include="..\Main\Main.sln" />
</ItemGroup>

<!-- The follwing paths should be added to reference search paths for the build tasks -->
<ItemGroup>
 <MyAddRefPath Include="$(MSBuildProjectDirectory)\..\..\Build\Lib1" />
 <MyAddRefPath Include="$(MSBuildProjectDirectory)\..\..\Build\Lib2" />
</ItemGroup>

<MSBuild
 Projects="@(ProjectsToBuild)"
 Properties="Configuration=Debug;OutputPath=$(BuildOutputPath)">
</MSBuild>

ОБНОВЛЕНИЕ:

Пожалуйста, покажите один полный рабочий скрипт, который вызывает исходный проект, такой как SLN с несколькими дополнительными ссылочными путями.

Нет предложений по улучшению структуры проекта, пожалуйста.Я знаю, как построить хорошую структуру, но теперь задача собрать существующий кусок дерьма.

Ответы [ 4 ]

4 голосов
/ 27 апреля 2011

Я наконец понял, как это сделать:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<ItemGroup>
    <ProjectsToBuild Include="ConsoleApplication1\ConsoleApplication1.csproj" />
</ItemGroup>

<ItemGroup>
    <AdditionalReferencePaths Include="..\Build\ClassLibrary1" />
    <AdditionalReferencePaths Include="..\Build\ClassLibrary2" />
</ItemGroup>

<PropertyGroup>
    <BuildOutputPath>..\Build\ConsoleApplication1</BuildOutputPath>
</PropertyGroup>

<Target Name="MainBuild">
    <PropertyGroup>
        <AdditionalReferencePathsProp>@(AdditionalReferencePaths)</AdditionalReferencePathsProp>
    </PropertyGroup>
    <MSBuild
        Projects="ConsoleApplication1\ConsoleApplication1.csproj"
        Properties="ReferencePath=$(AdditionalReferencePathsProp);OutputPath=$(BuildOutputPath)"
    >
    </MSBuild>
</Target>

1 голос
/ 11 марта 2011

Вы заявили, что хотите иметь возможность изменять пути поиска сборок без непосредственного изменения файлов проекта. Чтобы выполнить это требование, вам нужно установить переменную среды, которая переопределит AssemblySearchPaths. С помощью этого метода вам нужно будет указать каждый путь ссылки сборки, используемый всеми проектами в решениях. (Изменение проектов или копий проектов будет проще. См. Заключительные комментарии.)

Один из методов - создать пакетный файл, в котором ваш скрипт запускает переменную среды:

set AssemblySearchPaths="C:\Tacos;C:\Burritos;C:\Chalupas"
msbuild whatever.msbuild

Другой способ - определить группу PropertyGroup в вашем пользовательском файле msbuild (иначе называемом «ловушкой», необходимой для этой работы):

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <ProjectsToBuild Include="..\Main\Main.sln" />
    </ItemGroup>

    <PropertyGroup>
          <AssemblySearchPaths>$(MSBuildProjectDirectory)\..\..\Build\Lib1;$(MSBuildProjectDirectory)\..\..\Build\Lib2</AssemblySearchPaths>
    </PropertyGroup>

    <Target Name="Build">
        <MSBuild Projects="@(ProjectsToBuild)" Properties="AssemblySearchPaths=$(AssemblySearchPaths);Configuration=Debug;OutputPath=$(OutputPath)" />
    </Target>
</Project>

Теперь, если бы это был я, и по какой-то необъяснимой причине я не мог изменить файлы проекта, чтобы включить обновленные ссылки, с которыми я собираюсь строить, я сделал бы копии файлов проекта, загрузил бы их в IDE, и исправьте ссылки в моих копиях. Синхронизация проектов становится простой операцией сравнения / слияния, которая выполняется автоматически с помощью современных инструментов, таких как mercurial (черт, я уверен, что clearcase может справиться и с этим).

0 голосов
/ 12 марта 2011

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

<ItemGroup>
    <MyAddRefPath Include="$(MSBuildProjectDirectory)\..\..\Build\Lib1" />
    <MyAddRefPath Include="$(MSBuildProjectDirectory)\..\..\Build\Lib2" />    
</ItemGroup>
<PropertyGroup>
    <MyAddRefPath>$(MSBuildProjectDirectory)\..\..\Build\Lib3</MyAddRefPath>
    <!-- add in the property path -->
    <AssemblySearchPaths>$(MyAddRefPath);$(AssemblySearchPaths)</AssemblySearchPaths>
    <!-- add in the item paths -->
    <AssemblySearchPaths>@(MyAddRefPath);$(AssemblySearchPaths)</AssemblySearchPaths>
</PropertyGroup>

... и если вынужно сделать это в цели, чтобы выбрать пути из динамически заполненной группы элементов, использовать встроенные свойства, а не задачу CreateProperty (если вы не застряли в v2.0)

<Target Name="AddToSearchPaths">
    <PropertyGroup>
        <!-- add in the item paths -->
        <AssemblySearchPaths>@(MyDynamicAddRefPath);$(AssemblySearchPaths)</AssemblySearchPaths>
    </PropertyGroup>
</Target>
0 голосов
/ 11 марта 2011

Свойство, которое вы хотите изменить: AssemblySearchPaths . См. ResolveAssemblyReference дополнительную информацию.

<Target Name="AddToSearchPaths">  
  <CreateProperty Value="x:\path\to\assemblies;$(AssemblySearchPaths)">  
    <Output PropertyName="AssemblySearchPaths" TaskParameter="Value" />  
  </CreateProperty>  
</Target>

Используя группы товаров, как в вашем примере, это будет выглядеть так:

<Target Name="AddToSearchPaths">  
  <CreateProperty Value="@(MyAddRefPath);$(AssemblySearchPaths)">  
    <Output PropertyName="AssemblySearchPaths" TaskParameter="Value" />  
  </CreateProperty>  
</Target>

Глядя в% WINDIR% \ Microsoft.NET \ Framework \ v2.0.50727 \ Microsoft.Common.targets, вы можете видеть, что задача ResolveAssemblyReference выполняется как часть ResolveAssemblyReferences цель. Таким образом, вы хотите, чтобы вновь добавленная цель изменила свойство AssemblySearchPaths до выполнения ResolveAssemblyReferences .

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