是否有推荐的方法可以使用MSBuild配置针对TeamCity中多个框架的NuGet包?

是否有推荐的方法可以使用MSBuild配置针对TeamCity中多个框架的NuGet包?,msbuild,teamcity,nuget,.net-framework-version,multitargeting,Msbuild,Teamcity,Nuget,.net Framework Version,Multitargeting,我已经阅读了一些帖子(见下面的参考资料),还没有找到一个针对我的技术堆栈的最佳实践指南 目标:通过TeamCity使用MSBuild和NuGet创建一个单一的NuGet包,目标是通过单个.csproj文件构建多个.NET框架 约束条件: 仅从VCS中提取一次代码 所有已编译程序集的版本应相同 单个.csproj(不是每个目标框架一个) 我有两个想法: 创建单个生成配置。它将包含三个构建步骤:编译.NET3.5、编译.NET4.0和打包NuGet。每个构建步骤都取决于最后一步的成功。我看到这种方法

我已经阅读了一些帖子(见下面的参考资料),还没有找到一个针对我的技术堆栈的最佳实践指南

目标:通过TeamCity使用MSBuild和NuGet创建一个单一的NuGet包,目标是通过单个.csproj文件构建多个.NET框架

约束条件:

  • 仅从VCS中提取一次代码
  • 所有已编译程序集的版本应相同
  • 单个.csproj(不是每个目标框架一个)
  • 我有两个想法:

  • 创建单个生成配置。它将包含三个构建步骤:编译.NET3.5、编译.NET4.0和打包NuGet。每个构建步骤都取决于最后一步的成功。我看到这种方法的唯一真正问题(希望有一个我不知道的解决方案)是,每个构建步骤都需要自己的一组构建参数(例如system.TargetFrameworkVersion和system.OutputPath)来指定DLL的唯一位置(例如bin\release\v3.5和bin\release\v4.0)因此,NuGet pack步骤将能够基于.nuspec文件中的Files部分完成它的工作

  • 创建多个构建配置。按照上述构建步骤进行一次构建配置。使用这种方法,很容易解决TargetFrameworkVersion和OutputPath生成参数问题,但我现在必须创建快照依赖项,并在各个生成中共享程序集版本号。它还占用了构建配置插槽,这对我们来说是正常的(但不是最佳的),因为我们有企业许可证

  • 选项1似乎是显而易见的选择。选项2感觉很脏

    所以我的两个问题是:

  • 是否可以创建生成步骤特有的参数
  • 还有第三种更好的方法吗
  • 参考文献:


  • 这是我的首选解决方案(选项1):

    魔术依赖于一个不幸的变通方法。如果你愿意做出妥协,这个解决方案确实有效。如果你不是,你可以跟随

    单版本配置如下所示:

    请注意前两个构建步骤的名称。事实上,它们分别被显式命名为.NET 3.5和4.0的TargetFrameworkVersion值

    然后,在构建参数部分,我配置了以下参数:

    最后,Nuget Pack步骤根据my.nuspec的文件部分执行文件路径转换:

    <files>
        <file src="bin\release\v3.5\*.*" target="lib\net35" />
        <file src="bin\release\v4.0\*.*" target="lib\net40" />
    </files>
    

    这里有一个采用第二种方法的解决方案:

    该项目包含以下生成配置和模板:

    共享内部版本号生成器是链中的第一个内部版本。它只会创建一个独立版本将共享的版本号。我正在使用Nicholas Williams引用的TeamCity插件

    以下是构建模板中值得注意的配置:

    请注意,内部版本号来自上述共享内部版本号生成器的内部版本ID。在我的例子中,这个构建的ID是14。还要注意工件路径中的变量%TargetFrameworkVersion%。幸运的是,TeamCity几乎在任何地方都支持变量插值

    为了使模板利用生成编号,它必须对该生成配置具有快照依赖关系:

    最后(关于模板),构建参数与我首选解决方案中的参数几乎相同。但是,请注意附加的配置参数。这是继承的生成配置将覆盖的内容:

    然后,在依赖生成中,您必须连接快照依赖项,以便生成编号(从模板继承)通过对共享生成编号生成配置的依赖项实际工作:

    当然,您需要设置实际的目标框架:

    配置了实际版本后,现在可以配置NuGet pack版本配置。您不需要连接到VCS根目录:

    但您确实需要配置一系列依赖项(快照和工件):


    最后,你完成了。

    我已经通过这两种方法找到了解决方案,并将很快(在时间允许的情况下)发布单独的答案。我屏住呼吸等待;-)巧合的是,我也有同样的要求。哈哈,蒂姆。我从组装信息youtrack讨论()中认出了您的名字。你和我关注的是同一个问题。本周我将尝试发布我的两个答案+1对于这两个答案,因为您花了时间编写了一本完整的手册。这里有另一种方法,不涉及任何TeamCity参数,完全使用Visual Studio项目构建配置、nuspec和TeamCity构建完成:我有同样的问题,并使用了您的解决方案的一个版本。然而,当我正在构建的组件使用NuGet包时,我遇到了问题。我的目标是v4.0和v4.5,并且依赖于EntityFramework 6.x。当我构建包的4.0版本时,我希望它使用相同版本的EF。我还没有尝试过不同的重新安装场景,但从我的研究来看,它们似乎有缺陷。