使用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框架为目标的
- 一项为其构建解决方案的任务 .NET3.5(简单易用)
- 一项为其构建解决方案的任务 .NET2.0 在此任务中,我调用MSBuild,并指定TargetFrameworkVersion应为v2.0。我还定义了一些额外的生成条件(这样,针对.NET2.0的程序集中就不会生成.NET3.5特定的代码)
或者,有没有其他方法来实现这一点,因为我不想在构建脚本中再次指定每个依赖项。我想这很快就会成为维护的噩梦。我已经能够通过确保不引用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#构建引擎。