MSBuildSdkExtras

其他类别 2025-08-03

msbuild.sdk.extras

概括

该软件包包含一些额外的扩展,这些扩展名是Microsoft.net.sdk SDK中目前尚不可用的SDK式项目。此功能在dotnet/sdk#491中跟踪,许多方案都在.NET 6的路线图上。

该项目的主要目标是启用多目标,而无需您在CSPROJ,VBPROJ,FSPROJ中输入大量属性,从而使其保持良好和清洁。

有关更多信息,请参见博客文章。

支持的.NET Core SDK版本

重要: 3.x的附加功能需要.NET 5 SDK或更高版本。 SDK可以构建以前的目标,例如NetCoreApp3.1。 Extras 2.X支持SDK 2.x和3.x。

高级方案

该软件包还可以启用高级库方案,使您可以创建参考组件和每个倒计时的Identifendifier目标。

参考组件

参考组件在几种情况下有用。请参阅我的两个博客以获取更多详细信息。

每次限时身份

在某些情况下,涉及本机Interop,可能有必要具有不同的运行时版本。如果您通过Runtimes文件夹与参考程序集使用PackageReference,则Nuget支持了一段时间。创建和包装这些是手动的。

请参阅下文,以便轻松使用附加功能创建这些。

软件包名称:msbuild.sdk.extras

稳定的:

CI feed:https://pkgs.dev.azure.com/clairernovotny/gitbuilds/_packaging/msbuildsdkextras/nuget/v3/index.json

入门(vs 15.6+)

Visual Studio 2017 Update 6(又名V15.6 )包括对SDK从Nuget解决的支持,这是工作所必需的。建议使用VS 2019。

使用SDK

  1. 创建一个新项目

    • .NET核心控制台应用程序或.NET标准类库。
    • 与您现有的SDK风格项目一起。
    • 在存储库的TestProjects文件夹中使用模板。
  2. 将Microsoft.net.sdk替换为MSBUILD.SDK.EXTRAS,将其替换为项目的顶级SDK属性。

  3. 您必须告诉MSBUILD,SDK应该通过

    • 添加包含SDK名称和版本的global.json。
    • 将版本信息附加到SDK属性值。
  4. 然后,您可以为其他TFM编辑TargetFramework,也可以将目标帧重命名为TargetFrameWorks,并使用A指定多个TFM;分离器。

最终项目应该看起来像:

< Project Sdk = " MSBuild.Sdk.Extras " >
  < PropertyGroup >
    < TargetFrameworks >net46;uap10.0.19041;tizen8.0TargetFrameworks >
  PropertyGroup >
Project >

.NET 5 SDK是最新的,并且对桌面工作负载有更多支持。强烈建议使用该SDK,甚至可以构建较旧的目标。如果您使用的是msbuild.sdk.extras版本2或更高版本,请最少使用.NET Core 3.1 SDK。您仍然可以针对.NET Core的先前版本。

{
  "msbuild-sdks" : {
    "MSBuild.Sdk.Extras" : " 3.0.22 "
  }
}

SDK部分上方表示使用.NET Core 3预览要构建,MSBUILD-SDK表示要包含的Nuget软件包。

然后,您从该目录转发的所有项目文件都使用Global.json文件中的版本。对于解决方案中的所有项目,这将是首选解决方案。

再说一次,您可能只想覆盖一个项目的版本,或者如果您的解决方案中只有一个项目(不添加global.json),则可以这样这样做:

< Project Sdk = " MSBuild.Sdk.Extras/3.0.22 " >
  < PropertyGroup >
    < TargetFrameworks >net46;uap10.0.19041;tizen8.0TargetFrameworks >
  PropertyGroup >
Project >

就是这样。您不需要指定UWP或Tizen Meta包装,因为它们将自动包含。之后,您可以使用还原,构建,打包目标来还原软件包,构建项目并创建Nuget软件包。例如:msbuild /t:包装...

重要的是要注意

  • 它只能与使用桌面MSBuild(IE Visual Studio)和不是跨平台的目标平台SDK一起使用。
  • 使用JetBrains Rider时,您需要在设置中指向桌面MSBuild(设置>构建,执行,部署>使用MSBUILD版本)
  • 从CLI构建时,必须使用msbuild.exe。 dotnet构建对大多数项目类型都不起作用
  • 它可能在Visual Studio代码中起作用,但是您必须在启动中配置构建任务。JSON使用桌面MSBuild进行构建。
  • 您必须安装打算构建的平台的工具。对于Xamarin,这意味着Xamarin工作量;对于UWP,也安装了这些工具。

有关如何解决SDK的更多信息,请参见此处。

创建每个倒计时的Identifentifier软件包

您需要执行几个步骤:

  1. 即使您只构建一个单一的目标框架,也要确保使用目标帧工程而不是TargetFramework。我正在摆脱其循环功能。
  2. 将Runtime Idendifiers属性设置为有效RID(完整列表),并由半彩色( win; Unix )隔开。
  3. 对于您想要单独构建的TFM,请将ExtrasBuildEachRuntimeIdentimendifier属性设置为true。

完成后,您应该能够运行构建/包装,并且它将产生Nuget软件包。

笔记:

  • 您必须使用SDK =“ msbuild.sdk.extras”方法。对于这种情况,不支持使用Packagerference。
  • 虽然Visual Studio上下文不会显示每个RED,但每个RED都会为每个RED构建。
  • 附加功能定义了每个RID使用的预处理器符号(Win-X86将是WIN_X86和CENTOS.7-X64将是Centos_7_x64)。点和破折号变成了内部底。
  • Nuget软件包中每台输出组件和符号的默认路径是Runtimes//lib/
  • 可以使用该属性上的条件设置Runtime Identifiers。这使您可以拥有多个TFM,但其中只有一些有RID。

参考组件

您可能需要创建参考组件,以简化具有复杂风味(TargetFramework×Runtime Indentifier)矩阵的图书馆的开发和消费。参考组件被包装到Ref/文件夹中。请参阅我的两篇博客文章以获取详细信息。

包装其他内容

如果您需要将本机资产添加到运行时,最简单的方法是使用:

< None Include = " path/to/native.dll " PackagePath = " runtimes//native " Pack = " true " />

输出包中的内容路径覆盖内容路径

将输出组件和符号打包到工具(而不是运行时间)子文件夹的最小示例。

< PropertyGroup >
  < ExtrasIncludeDefaultProjectBuildOutputInPackTarget >IncludeDefaultProjectBuildOutputInPackExtrasIncludeDefaultProjectBuildOutputInPackTarget >
PropertyGroup >

< Target Name = " IncludeDefaultProjectBuildOutputInPack " >
  < ItemGroup >
    < None Include = " @(RidSpecificOutput) " PackagePath = " tools/%(TargetFramework)/%(Rid) " Pack = " true " />
  ItemGroup >
Target >

有关高级选项,请参见ClassLibPack* SDK测试和RIDS.TARGETS文件。

从旧方式迁移(vs 15.6)

对于那些以包装方式使用的人,您无法使用此软件包的v2.0+这样做。因此,更新至15.6+,并手动升级您的项目,如下所示:

  1. 与上面相同,替换SDK属性的值。
  2. 删除用旧方法指定的实现方法。进口属性应为MSBuildSdkExtras目标。
  3. 进行试用构建,然后将您的项目与存储店TestProjects文件夹中的模板进行比较,以在遇到任何问题时对任何问题进行故障排除。
  4. 请提出问题。

您的项目差异:

+ net46;uap10.0.16299;tizen40 - - MSBuildSdkExtras Targets)')"/> ">
 - 
+ 
  
  
    net46;uap10.0.16299;tizen40
  

  
-    
  
  

-  
  
 - PackageReference style
+ SDK style

注意:SDK风格的项目现在在Mac的Visual Studio上工作。

发行说明

1.6.0

  • 已经更改了一些属性,并提供了帮助使用新属性名称的警告。

    旧财产 新属性/行为
    抑制Warnifoldsdkpack Extrasignoreoldsdkwarning
    额额绘制PlatformPackagedisabled disableImplicitFrameWorkReferences + TargetFramework条件
    嵌入式RESCERCEGENERATERATOISIONISINISINISINENTER 与临时室内的codeispublic相反
  • 对WPF和Windows表单的支持需要一个选择属性才能启用:设置ExterenableWpfProjectSetup/exterenableWinformSprojectSetup to true以包含所需的参考和默认项目。注意.NET Core 3.0已被USEWPF/useWindowsForms替换。

单个或多目标

配置此软件包后,您现在可以使用目标帧或TargetFrameworks元素中的任何支持的TFM。受支持的TFM家庭是:

  • NetStandard(.NET标准)
  • NetCoreApp(.NET Core App)
  • NET(.NET 5+和.NET框架)
  • net35-client/net40-client(.NET Framework Legacy Client配置文件)
  • WPA(Windows Phone App 8.1)
  • 赢(Windows 8 / 8.1)
  • UAP(Windows 10 / UWP)
  • WP(Windows Phone Silverlight,WP7+)
  • SL(Silverlight 4+)
  • 蒂森(Tizen 3+)
  • Xamarin.android
  • Xamarin.ios
  • Xamarin.mac
  • Xamarin.Watchos
  • Xamarin.tvos
  • portablenn-/portable-(如Portable Net45+Win8+WPA81+WP8等旧版PCL配置文件)

对于Legacy PCL配置文件,列表中TFM的顺序并不重要,但是该配置文件必须与已知配置文件之一的确切匹配。如果不是这样,您会收到一个编译错误,说它未知。您可以在此处查看已知配置文件的完整列表:Stephen Cleary的便携式库配置文件。

如果您尝试使用未安装工具的框架,那么您也会遇到一个错误来检查工具。在某些情况下,这可能意味着安装旧版本的Visual Studio IDE(如2015年),以确保在计算机上安装必要的目标。

下载源码

通过命令行克隆项目:

git clone https://github.com/novotnyllc/MSBuildSdkExtras.git