You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需指定平台版本从nuspec构建NuGet包?

如何不指定平台版本从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:24:58