我有一个小项目,我希望有该项目的2个编译版本:
我不会在(不相关的)细节上做太多,但我的解决方案是针对VS.NET中的.NET 3.5框架设置的。
我有2个msbuild-tasks:
为其构建解决方案的一项任务 .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说某些第三方引用必须在本地复制? 或者,有没有其他方法来实现这一点,因为,我不想在我的构建脚本中再次指定每个依赖项。我猜这很快就会成为维护的噩梦。
答案 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