【问题标题】:TeamCity NuGet package build for different .NET FrameworksTeamCity NuGet 包为不同的 .NET 框架构建
【发布时间】:2017-02-24 02:17:09
【问题描述】:

我一直在更新以 .NET Framework 为目标的项目版本,更新到最新的 .NET (4.6.2)。

其中一些项目是 NuGet 包,内置于 TeamCity 9.0.2。

我已使用 this 指南中的步骤为不同的 .NET Framework 版本创建多个构建配置,因为我尚未更新到 4.6.2 的一些项目引用了 NuGet 包。因此,我试图让 TeamCity 使用这些构建配置来输出各种 Net40、Net45、Net46 和 Net462 版本,以便在更新包时无需强制升级所有使用 NuGet 的项目。

我真的不知道如何在 TeamCity 中执行此操作。我相当肯定这应该在“构建步骤”配置中完成,但到目前为止我还没有设法让它工作。

所以我尝试过的一件事,我认为我需要做但不确定是否重复第一个构建步骤并将Configuration 设置为Release-Net46。我认为这是必要的,否则将无法构建此版本的程序集(如果我错了,请纠正我!)

我尝试的第二件事是复制NuGet Pack 步骤并在Properties 中设置Configuration=Release-Net46 但所做的只是用Net46 替换Net462 版本,而不是像我希望的那样将这两个版本都包含在工件中.

我还尝试在NuGet PackProperties 中设置多个Configuration 元素,例如Configuration=Release;Configuration=Release-Net46Configuration=Release,Release-Net46,但这两者都导致构建完全失败,所以显然这不是答案。

我认为必须有一种方法来获取此NuGet Pack 构建步骤以从其他构建配置中获取输出并将所有可用版本的程序集输出到工件。

这可能吗?我曾考虑为 TeamCity 中的每个构建配置创建单独的项目,但我不确定这是否是正确的方法,或者它是否会导致包源出现问题,并且为每个 .NET Framework 版本复制该项目四次似乎很不整洁.

【问题讨论】:

    标签: .net nuget teamcity .net-framework-version teamcity-9.0


    【解决方案1】:

    好的,我最终通过反复试验和学习 NuSpec 解决了这个问题。请注意,我没有找到使用纯 TeamCity 设置的方法,但这同样好。

    我是正确的,您需要额外的构建步骤来构建解决方案/项目级别构建配置中的程序集并将每个 Configuration 指向 Release-NetX

    编辑我发现实际上最好将NetX 构建步骤指向.csproj 而不是.sln。这样你就不需要解决方案级别的构建配置,只要它们存在于 .csproj 中,那么它就可以正常构建。

    完成此操作后,TC 会将所有版本构建到各自的 bin\Release-NetX 目录中。

    接下来是将.nuspec 文件添加到解决方案项目的根目录以构建 NuGet。

    <?xml version="1.0"?>
    <package xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <metadata xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
        <id>Foo.Bar.Package</id>
        <version>1.0.23</version>
        <authors>FooBar Industries</authors>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>FooBar Industries package</description>
      </metadata>
      <files>
        <file src="bin\Release\*.dll" target="lib\net462" />
        <file src="bin\Release-Net46\*.dll" target="lib\net46" />
        <file src="bin\Release-Net45\*.dll" target="lib\net45" />
        <file src="bin\Release-Net4\*.dll" target="lib\net40" />
      </files>
    </package>
    

    接下来是更改NuGet Pack TeamCity 构建步骤和Specification files 部分并将其指向您的.nuspec 文件。 Prefer project files to .nuspec 有一个复选框。只需取消选中它就可以为我工作,我什至不需要指向.nuspec 文件。

    然后在触发构建时,所有版本都会输出,然后可以使用,而无需升级引用此包的所有项目。

    【讨论】:

    • 很酷的解决方案!但是测试呢?在包含“Release”子字符串的通配符期间,似乎只会测试“Release”配置。在“Release-Net46”文件夹和其他文件夹中测试程序集怎么样?
    • 您提出了一个很好的观点,您必须为每组测试创建重复的 NUnit 步骤。应该指向各种构建配置的 bin\Release-NetX。老实说,我只需要针对其他项目输出的不同框架版本,我没有想过扩展单元测试以使用每个版本。好主意!
    • 关于您的编辑。您能否阐明“这样您就不需要解决方案级别的构建配置”的意思。 @RobinFrench
    • @JuztBe 如果您在解决方案上设置 Net4X 构建配置文件,那么它们会出现在解决方案配置下拉列表中,通常只有“调试”和“发布”。但是,您实际上并不需要解决方案级别的新配置,如果您将它们直接放入 csproj 文件并在 TC 构建步骤中指向它们,那么您可以完全避免编辑解决方案。我发现它很有用,因为我只需要一个项目,而不是整个解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 2020-03-05
    相关资源
    最近更新 更多