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
-
创建一个新项目
- .NET核心控制台应用程序或.NET标准类库。
- 与您现有的SDK风格项目一起。
- 在存储库的TestProjects文件夹中使用模板。
-
将Microsoft.net.sdk替换为MSBUILD.SDK.EXTRAS,将其替换为项目的顶级SDK属性。
-
您必须告诉MSBUILD,SDK应该通过
- 添加包含SDK名称和版本的global.json。
- 将版本信息附加到SDK属性值。
-
然后,您可以为其他TFM编辑TargetFramework,也可以将目标帧重命名为TargetFrameWorks,并使用A指定多个TFM;分离器。
最终项目应该看起来像:
< Project Sdk = \" MSBuild.Sdk.Extras \" > < PropertyGroup > < TargetFrameworks >net46;uap10.0.19041;tizen8.0</ TargetFrameworks > </ 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.0</ TargetFrameworks > </ 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软件包
您需要执行几个步骤:
- 即使您只构建一个单一的目标框架,也要确保使用目标帧工程而不是TargetFramework。我正在摆脱其循环功能。
- 将Runtime Idendifiers属性设置为有效RID(完整列表),并由半彩色(<runtimeidendifiers> win; Unix </runtimeidendifiers>)隔开。
- 对于您想要单独构建的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/<RuntimeIdentifier>/lib/<TargetFrameWork>。
- 可以使用该属性上的条件设置Runtime Identifiers。这使您可以拥有多个TFM,但其中只有一些有RID。
参考组件
您可能需要创建参考组件,以简化具有复杂风味(TargetFramework×Runtime Indentifier)矩阵的图书馆的开发和消费。参考组件被包装到Ref/<TargetFramework>文件夹中。请参阅我的两篇博客文章以获取详细信息。
包装其他内容
如果您需要将本机资产添加到运行时,最简单的方法是使用:
< None Include = \" path/to/native.dll \" PackagePath = \" runtimes/<rid>/native \" Pack = \" true \" />
输出包中的内容路径覆盖内容路径
将输出组件和符号打包到工具(而不是运行时间)子文件夹的最小示例。
< PropertyGroup > < ExtrasIncludeDefaultProjectBuildOutputInPackTarget >IncludeDefaultProjectBuildOutputInPack</ ExtrasIncludeDefaultProjectBuildOutputInPackTarget > </ 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+,并手动升级您的项目,如下所示:
- 与上面相同,替换SDK属性的值。
- 删除用旧方法指定的实现方法。进口属性应为MSBuildSdkExtras目标。
- 进行试用构建,然后将您的项目与存储店TestProjects文件夹中的模板进行比较,以在遇到任何问题时对任何问题进行故障排除。
- 请提出问题。
您的项目差异:
<PropertyGroup>
<TargetFrameworks>net46;uap10.0.16299;tizen40</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
– <PackageReference Include="MSBuild.Sdk.Extras" Version="1.6.0" PrivateAssets="All"/>
</ItemGroup>
– <Import Project="$(MSBuildSdkExtrasTargets)" Condition="Exists(\’$( <span class=\” notranslate keguazi>MSBuildSdkExtras Targets)\’)\”/>
<!– OTHER IMPORTS –>
</Project>\”>
- <Project Sdk=\"Microsoft.NET.Sdk\"> + <Project Sdk=\"MSBuild.Sdk.Extras\"> <!-- OTHER PROPERTIES --> <PropertyGroup> <TargetFrameworks>net46;uap10.0.16299;tizen40</TargetFrameworks> </PropertyGroup> <ItemGroup> - <PackageReference Include=\"MSBuild.Sdk.Extras\" Version=\"1.6.0\" PrivateAssets=\"All\"/> <!-- OTHER PACKAGES/INCLUDES --> </ItemGroup> - <Import Project=\"$( MSBuildSdkExtras Targets)\" Condition=\"Exists(\'$( MSBuildSdkExtras Targets)\')\"/> <!-- OTHER IMPORTS --> </Project>
- 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年),以确保在计算机上安装必要的目标。
