为不同的 .NET 框架构建 TeamCity NuGet 包
TeamCity NuGet package build for different .NET Frameworks
我一直在对更新到最新 .NET (4.6.2) 的项目的 .NET Framework 目标版本进行更新。
其中一些项目是 NuGet 包,内置于 TeamCity 9.0.2。
我已经使用 this 指南中的步骤为不同的 .NET Framework 版本创建多个构建配置,因为我还没有更新到 4.6.2 的一些项目引用了 NuGet 包。因此,我试图让 TeamCity 使用这些构建配置来输出各种 Net40、Net45、Net46 和 Net462 版本,以便我具有完全兼容性,而无需在更新包时强制升级所有使用 NuGet 的项目。
我真的不知道如何在 TeamCity 中执行此操作。我相当确定这应该在 "Build Steps" 配置中完成,但到目前为止我还没有设法让它工作。
所以我试过一件事,我认为我需要做但不确定是复制第一个构建步骤并将 Configuration
设置为 Release-Net46
。我认为这是必要的,否则将无法构建此版本的程序集(如果我对此有误,请纠正我!)
我尝试的第二件事是复制 NuGet Pack
步骤并在 Properties
中设置 Configuration=Release-Net46
但所做的只是用 Net46 替换 Net462 版本而不包括两者像我希望的那样在人工制品中。
我还尝试在 NuGet Pack
的 Properties
中添加多个 Configuration
元素,例如 Configuration=Release;Configuration=Release-Net46
或 Configuration=Release,Release-Net46
,但这两个都导致构建如此明显地完全失败,这不是答案。
我认为必须有一种方法可以让这个 NuGet Pack
构建步骤从其他构建配置中获取输出并将程序集的所有可用版本输出到工件。
这可能吗?我曾考虑过为 TeamCity 中的每个构建配置创建单独的项目,但我不确定这是正确的方法还是会导致包提要出现问题,并且为每个 .NET Framework 版本复制项目四次似乎不整洁.
好的,我最终通过反复试验和学习 NuSpec 解决了这个问题。请注意,我没有找到使用纯 TeamCity 设置来执行此操作的方法,但这同样好。
我是正确的,您需要额外的构建步骤来构建 solution/project 级别构建配置中的程序集,并将每个 Configuration
指向 Release-NetX
。
EDIT 我发现在上面实际上最好将 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 Build Step 和 Specification files
部分,并将其指向您的 .nuspec
文件。 Prefer project files to .nuspec
有一个复选框。它只通过取消选中它对我有用,我什至不需要指向 .nuspec
文件。
然后在触发构建时,输出所有版本,然后无需升级所有引用此包的项目即可使用。
我一直在对更新到最新 .NET (4.6.2) 的项目的 .NET Framework 目标版本进行更新。
其中一些项目是 NuGet 包,内置于 TeamCity 9.0.2。
我已经使用 this 指南中的步骤为不同的 .NET Framework 版本创建多个构建配置,因为我还没有更新到 4.6.2 的一些项目引用了 NuGet 包。因此,我试图让 TeamCity 使用这些构建配置来输出各种 Net40、Net45、Net46 和 Net462 版本,以便我具有完全兼容性,而无需在更新包时强制升级所有使用 NuGet 的项目。
我真的不知道如何在 TeamCity 中执行此操作。我相当确定这应该在 "Build Steps" 配置中完成,但到目前为止我还没有设法让它工作。
所以我试过一件事,我认为我需要做但不确定是复制第一个构建步骤并将 Configuration
设置为 Release-Net46
。我认为这是必要的,否则将无法构建此版本的程序集(如果我对此有误,请纠正我!)
我尝试的第二件事是复制 NuGet Pack
步骤并在 Properties
中设置 Configuration=Release-Net46
但所做的只是用 Net46 替换 Net462 版本而不包括两者像我希望的那样在人工制品中。
我还尝试在 NuGet Pack
的 Properties
中添加多个 Configuration
元素,例如 Configuration=Release;Configuration=Release-Net46
或 Configuration=Release,Release-Net46
,但这两个都导致构建如此明显地完全失败,这不是答案。
我认为必须有一种方法可以让这个 NuGet Pack
构建步骤从其他构建配置中获取输出并将程序集的所有可用版本输出到工件。
这可能吗?我曾考虑过为 TeamCity 中的每个构建配置创建单独的项目,但我不确定这是正确的方法还是会导致包提要出现问题,并且为每个 .NET Framework 版本复制项目四次似乎不整洁.
好的,我最终通过反复试验和学习 NuSpec 解决了这个问题。请注意,我没有找到使用纯 TeamCity 设置来执行此操作的方法,但这同样好。
我是正确的,您需要额外的构建步骤来构建 solution/project 级别构建配置中的程序集,并将每个 Configuration
指向 Release-NetX
。
EDIT 我发现在上面实际上最好将 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 Build Step 和 Specification files
部分,并将其指向您的 .nuspec
文件。 Prefer project files to .nuspec
有一个复选框。它只通过取消选中它对我有用,我什至不需要指向 .nuspec
文件。
然后在触发构建时,输出所有版本,然后无需升级所有引用此包的项目即可使用。