msbuild脚本中的其他路径

时间:2011-03-11 17:43:34

标签: msbuild continuous-integration

如何为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 个答案:

答案 0 :(得分:4)

我终于想出了如何做到这一点:

<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 :(得分:1)

您已声明希望能够修改程序集搜索路径而无需直接修改项目文件。为了满足该要求,您需要设置一个覆盖AssemblySearchPaths的环境变量。使用此技术,您需要提供解决方案中所有项目使用的每个程序集引用路径。 (修改项目或项目副本会更容易。请参阅最终评论。)

一种技术是创建一个批处理文件,在设置环境变量时运行脚本:

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

另一种方法是在自定义msbuild文件中定义一个PropertyGroup(也称为使其工作所需的“钩子”):

<?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也可以管理它)。

答案 2 :(得分:0)

您要修改的媒体资源是 AssemblySearchPaths 。请参阅ResolveAssemblyReference task更多信息。

<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 Task作为 ResolveAssemblyReferences 目标的一部分执行。因此,您希望新添加的目标在执行 ResolveAssemblyReferences 之前修改AssemblySearchPaths属性。

答案 3 :(得分:0)

...并且请记住,您不需要为此使用目标,您可以使用项目范围的属性或项目,因为......

<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>