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

使用MSBuild针对不同的框架会产生依赖性问题,msbuild,cruisecontrol.net,msbuild-task,Msbuild,Cruisecontrol.net,Msbuild Task,我有一个小项目,我想要该项目的两个编译版本: 一个以.NET2.0框架为目标的 一个以.NET3.5框架为目标的 一切进展顺利;我已经将我的项目置于持续集成之下(使用CC.NET),并且我已经创建了2个CC.NET“项目”。每个目标框架一个项目 我不会过多地讨论(不相关的)细节,但我的解决方案是针对VS.NET中的.NET3.5框架而设置的 我有2个msbuild任务: 一项为其构建解决方案的任务 .NET3.5(简单易用) 一项为其构建解决方案的任务 .NET2.0 在此任务中,我调用M

我有一个小项目,我想要该项目的两个编译版本:

  • 一个以.NET2.0框架为目标的
  • 一个以.NET3.5框架为目标的
一切进展顺利;我已经将我的项目置于持续集成之下(使用CC.NET),并且我已经创建了2个CC.NET“项目”。每个目标框架一个项目

我不会过多地讨论(不相关的)细节,但我的解决方案是针对VS.NET中的.NET3.5框架而设置的

我有2个msbuild任务:

  • 一项为其构建解决方案的任务 .NET3.5(简单易用)
  • 一项为其构建解决方案的任务 .NET2.0

    在此任务中,我调用MSBuild,并指定TargetFrameworkVersion应为v2.0。我还定义了一些额外的生成条件(这样,针对.NET2.0的程序集中就不会生成.NET3.5特定的代码)

到目前为止,一切顺利。一切正常。 然而,现在的问题是:

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

但是,当CC.NET生成程序集的.NET2.0版本时,依赖项不会复制到我的输出目录。(然后,这会导致我的单元测试失败)

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

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

其次,还必须确保在csproj文件中,引用的程序集具有一个私有标记,其值设置为true。 像这样:

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

假的
...
真的

我再次讨论了这个问题,因为我不想手动更改csproj文件。 (当我更改引用时,我不能忘记再次调整csproj文件,以再次将私有节点设置为true)

所以,我一直在钻研MSDN,我偶然发现:

ResolveAssemblyReference.TargetFrameworkDirectories 财产

备注此属性用于确定的CopyLocal状态 结果项

如果未指定此属性,则不指定 结果项将具有 CopyLocal值为true,除非 显式地拥有私有元数据 其源项上的值为true

因此,这意味着还有另一种可能性,即设置ResolveAssemblyReference任务的TargetFrameworkDirectories。 然而,是否有人知道如何做到这一点?
我一直在尝试不同的事情,但似乎没有任何效果

我试过这个:

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

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

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

@(TargetFrameworkDir)
但是没有用。。。
也许其他人知道怎么做,或者有一个黄金提示。(我在这个该死的问题上花了很多时间。)

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

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

顺便说一句:我从来没有参考过GAC的第三方库(只参考那些来自微软的,甚至不是所有的)。我总是将它们复制到我的lib目录结构中,将它们添加到源代码管理中并从那里引用它们。就我而言,使用GAC中的程序集是一种糟糕的做法,因为它表示对开发机器设置的不必要依赖


此类目录的示例:

当我从VS.NET Targeting.NET 2.0构建时,资源正在本地复制(就像我想要的那样)。当我让CC.NET使用我的msbuild buidscript(targeting.NET2.0)生成解决方案时,引用的程序集不会在本地复制。当构建目标为3.5时(就像在VS.NET中指定的那样),将复制程序集。我想我会检查csproj和sln文件,看看其中指定了什么。我也不引用GAC的任何第三方程序集。我在lib目录中有我的依赖项,我从那里引用它们。(就像您所做的那样)那么我想.csproj和您的MSBuild构建脚本之间的差异一定存在。不幸的是,在这方面我帮不了你多少忙-我不使用自定义MSBuild脚本,我只是用VS解决方案文件调用MSBuild。在剩下的脚本编写过程中,我使用自己定制的C#构建引擎。