使用MSBuild定位不同的框架会产生依赖性问题

时间:2009-02-13 17:52:54

标签: msbuild cruisecontrol.net msbuild-task

我有一个小项目,我希望有该项目的2个编译版本:

  • 一个目标是.NET 2.0框架
  • 一个目标是.NET 3.5框架
一切顺利;我已将我的项目置于持续集成(使用CC.NET),并且我创建了2个CC.NET“项目”。每个目标框架的一个项目。

我不会在(不相关的)细节上做太多,但我的解决方案是针对VS.NET中的.NET 3.5框架设置的。

我有2个msbuild-tasks:

  • 为其构建解决方案的一项任务 .NET 3.5(简单易用)
  • 为其构建解决方案的一项任务 .NET 2.0

    在这个任务中,我调用MSBuild,并指定TargetFrameworkVersion应该是v2.0。我还定义了一些额外的构建条件(因此.NET3.5特定代码不是在面向.NET2.0的程序集中构建的)。

到目前为止,这么好。一切正常。 现在,问题是:

我的解决方案有一些依赖项(对第三方程序集的引用)。在VS.NET中,我为这些依赖项设置了'copy local'为true。 当CC.NET构建我的.NET3.5版本的程序集时,第三方依赖项确实被复制到我的输出目录。

但是,当CC.NET构建我的.NET2.0版本的程序集时,依赖项不会复制到我的output-directory。 (然后,这会导致我的单元测试失败)。

我现在的问题是: 在构建我的项目的.NET2.0版本时,如何向msbuild说某些第三方引用必须在本地复制? 或者,有没有其他方法来实现这一点,因为,我不想在我的构建脚本中再次指定每个依赖项。我猜这很快就会成为维护的噩梦。

3 个答案:

答案 0 :(得分:2)

我一直在重新审视这个问题,因为我不想手动更改csproj文件。 (当我更改我的引用时,我不能忘记再次调整csproj文件,再次将Private节点设置为true。)

所以,我一直在深入研究MSDN,我偶然发现了这个:

  

<强> ResolveAssemblyReference.TargetFrameworkDirectories   属性

     

备注此属性是确定CopyLocal状态所必需的   结果项目。

     

如果未指定此属性,则为no   结果项目将有一个   CopyLocal值为true,除非它们   显式拥有私有元数据   其源项目的值为true。

因此,这意味着还有另一种可能性,那就是设置ResolveAssemblyReference任务的TargetFrameworkDirectories。 但是,有没有人知道怎么做? 我一直在尝试不同的东西,但似乎没有任何工作......

我试过这个:

<ItemGroup>
    <TargetFrameworkDir Include="$(SystemRoot)\Microsoft.NET\Framework\v2.0.50727" />
</ItemGroup>

<PropertyGroup>
   <TargetDirsToUse>@(TargetFrameworkDir)</TargetDirsToUse>
</PropertyGroup>

<ResolveAssemblyReference TargetFrameworkDirectories="$(TargetDirsToUse)" />

但无济于事...... 也许其他人知道如何做到这一点,或者有一个黄金尖端。 (我已经花了很多时间讨论这个问题)。

答案 1 :(得分:1)

我已经能够通过确保不引用GAC中的程序集来解决此问题。 相反,我在我的项目中创建了一个包含第三方程序集的'lib'目录。 在我的解决方案中,我从那里引用第三方程序集,并设置copy local == True。

接下来,您还必须确保在csproj文件中,引用的程序集具有Private标记,其值设置为true。 像这样:

<Reference Include="...">
   <SpecificVersion>False</SpecificVersion>
   <HintPath>...</HintPath>
   <Private>True</Private>
</Reference>

答案 2 :(得分:0)

一个问题:如果您尝试在VisualStudio中编译2.0解决方案/项目会发生什么?第三方参考是否自动复制?

奇怪的是,这适用于3.5而不适用于2.0。我自己没有进行任何并行构建,但是当我将项目从2.0转换为3.5时,无论.NET版本如何,所有第三方引用都被复制。

顺便说一句:我从不引用GAC的第三方库(只有微软的,甚至不是全部的)。我总是将它们复制到我的lib目录结构中,将它们添加到源代码控制中并从那里引用它们。就我而言,使用GAC的程序集是不好的做法,因为它代表了对开发机器设置的不必要依赖。

此类目录的示例:http://code.google.com/p/projectpilot/source/browse/#svn/trunk/lib