代码之家  ›  专栏  ›  技术社区  ›  Frederik Gheysels

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

  •  2
  • Frederik Gheysels  · 技术社区  · 16 年前

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

    • 目标是.NET 2.0框架
    • 目标是.NET 3.5框架

    一切进展顺利;我已经将我的项目置于持续集成(使用cc.net)下,并且创建了2个cc.net“项目”。每个目标框架一个项目。

    我不会在(不相关的)细节上做太多,但我的解决方案是针对vs.net中的.NET 3.5框架而制定的。

    我有两个msbuild任务:

    • 构建解决方案的任务 .NET 3.5(简单易用)
    • 构建解决方案的任务 .NET 2

      在这个任务中,我调用msbuild,并指定targetframeworkversion应该是v2.0。我还定义了一些附加的构建条件(因此.net3.5特定的代码不会构建在程序集targetting.net2.0中)。

    到目前为止,一切都很好。一切正常。 但现在的问题是:

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

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

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

    3 回复  |  直到 16 年前
        1
  •  2
  •   Frederik Gheysels    16 年前

    我已经重新讨论了这个问题,因为我不想手动更改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)" />
    

    但无济于事… 也许其他人知道怎么做,或者有一个金小费。(我在这个问题上花了很多时间)。

        2
  •  1
  •   Frederik Gheysels    16 年前

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

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

    <Reference Include="...">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>...</HintPath>
       <Private>True</Private>
    </Reference>
    
        3
  •  0
  •   Igor Brejc    16 年前

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

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

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

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