如何无需指定平台版本从nuspec构建NuGet包?
问题重现
我需要构建一个仅包含第三方依赖的NuGet包,已有现成的nuspec文件不想新建项目维护。当前nuspec内容如下:
<?xml version="1.0" encoding="utf-8"?> <package xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> <metadata> <id>MyCompany.TestPack</id> <tags>Test</tags> <version>1.0.0</version> <authors>Example Inc.</authors> <owners>Example Inc.</owners> <description>This package provides data.</description> <language>en-US</language> <licenseUrl>https://example.com</licenseUrl> <requireLicenseAcceptance>true</requireLicenseAcceptance> <dependencies> <group targetFramework="net6.0-windows"> <dependency id="DevExpress.Data" version="[22.2.9]" /> </group> </dependencies> <frameworkReferences /> <developmentDependency>false</developmentDependency> </metadata> </package>
执行打包命令 nuget pack my.package.nuspec 时,出现错误:
NU1012: Some dependency group TFMs are missing a platform version:
net6.0-windows
尝试添加参数 /p:WindowsTargetPlatformVersion=7 无效,但将nuspec中的targetFramework改为net6.0-windows7.0或带版本的取值时,打包成功。
解决方案
1. 无法完全不指定平台版本
从.NET 5开始,Windows特定的TFM(如net6.0-windows)必须明确平台版本号,这是NuGet的强制要求——这类TFM需要绑定对应的Windows SDK版本,确保依赖兼容性。所以不存在完全不指定平台版本就能成功打包的方式,除非你改用通用的net6.0 TFM(但如果依赖包是Windows专属的,此方法不可行)。
2. 无需修改nuspec的打包方式
如果不想修改现有nuspec文件,可以通过MSBuild中转打包,步骤如下:
- 创建一个空的
.csproj文件(无需编写代码),内容示例:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net6.0-windows</TargetFramework> <!-- 指定你需要的Windows平台版本 --> <WindowsTargetPlatformVersion>7.0</WindowsTargetPlatformVersion> <!-- 复用现有nuspec文件 --> <NuspecFile>my.package.nuspec</NuspecFile> </PropertyGroup> <!-- 同步nuspec中的依赖配置 --> <ItemGroup> <PackageReference Include="DevExpress.Data" Version="[22.2.9]" /> </ItemGroup> </Project>
- 执行MSBuild打包命令:
msbuild /t:Pack /p:Configuration=Release
MSBuild会自动处理WindowsTargetPlatformVersion属性,生成符合要求的NuGet包,同时复用你现有nuspec的配置。
3. 直接修改nuspec的最简方式
如果允许修改nuspec,直接将targetFramework改为带版本的格式即可,比如:
<group targetFramework="net6.0-windows7.0">
之后直接执行原命令 nuget pack my.package.nuspec 就能成功打包。
为什么/p:WindowsTargetPlatformVersion=7无效?
该属性是MSBuild的专属参数,直接用nuget pack命令时,NuGet不会读取这个参数来修改nuspec中静态定义的TFM,因此无法生效。
内容的提问来源于stack exchange,提问作者WSK

