.Net Core迁移到MSBuild的多平台编译问题

1、前言

  本篇主要讨论.NET Core应用程序项目结构的主题,重点探索.NET Core应用程序的多平台编译问题,这里指的多平台是指.NET Framework、.NET Core App、.NET Standard、Mono、UWP等多平台的条件编译、项目(包)引用、编译符号等问题。git

  .NET Core已经将新的项目管理配置过渡回MSBuild编译系统中。虽然如今能够从无到有的使用VS2017来建立一个新的MSBuild项目,可是仍是有好多遗留程序使用着以JSON格式存储的项目配置文件为基础的项目。Scott Hanselman也在博客中发文教你们怎么使用新的.NET SDK RC4工具将project.json转换到MSBuild的.csproj项目系统。固然这篇文章也解释了MS为何要这么作。github

  MSBuild 是一种基于 XML 的项目文件格式的项目配置文件。这种格式容易理解、易于扩展而且彻底受 Microsoft 支持。MSBuild 项目文件的格式使开发人员可以充分描述哪些项须要生成,以及如何利用不一样的平台和配置生成这些项。另外,项目文件的格式还使开发人员可以创做可重用的生成规则,这些规则能够分解到不一样的文件中,以即可以在产品内的不一样项目之间一致地执行生成。json

  当时ASP.NET Core的第一个版本为了使开源平台对开发者更具吸引力,ASP.NET Core采用了一种基于JSON的项目系统project.json文件定义,这是一种与Node.js相似的定义,这对于吸引Web开发者来讲是个明智的选择。可是随着.NET Core的总体开源,非Web开发者如UWP和Xamarin,对这种JSON项目结构并不熟悉。这些开发者和社区都但愿继续使用MSBuild的XML项目系统。因些微软宣布他们将为.NET Core从新启用和规范MSBuild构建系统。在最新的.NET Core SDK 1.0 RC4 版本中,dotnet cli(命令行接口,dotnet cli 1.0.0-preview3-004056及之后版本)已经包含了”dotnet migrate”命令,这个命令为了将JSON为基础的配置项目转换为.csproj项目配置文件。工具

本文再也不谈论如何使用新dotnet cli命令行,而卓重讨论多平台编译问题。学习

2、定义多平台

project.json

在project.json项目配置中定义多平台,使用的是”frameworks”节点来配置的,而且在每一个平台节点下也配置了对应的项目引用或依赖。
下面的实例使用project.json定义的多平台和依赖以下:ui

"frameworks": {
    "net451": {
      "frameworkAssemblies": {
        "System.Xml": "4.0.0.0",
      }
    },
    "netstandard1.6": {
      "dependencies": {
        "System.Runtime":"4.1.0",
        "System.Xml.XmlSerializer": "4.0.11"
      },
    }
}

MSBuild

在.csproj项目配置中定义多平台,要使用”TargetFrameworks”的XML节点来配置:spa

<TargetFrameworks>netstandard1.6;net45;</TargetFrameworks>

若是要定义某个平台下的依赖引用的话须要以下定义:命令行

<ItemGroup Condition=" '$(TargetFramework)' == 'net45' ">
    <Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.6' ">
    <PackageReference Include="System.Xml.XmlSerializer" Version="4.0.11"/>
</ItemGroup>

固然有时候咱们还须要对某个平台定义,定义编译符号常量:code

<PropertyGroup Condition="'$(TargetFramework)' == 'netstandard1.6'">
    <DefineConstants>$(DefineConstants);NETSTANDARD</DefineConstants>
</PropertyGroup>

这些代码中就能够针对平台特性来编写代码了:orm

#if NETSTANDARD
    //netstandard1.*平台代码
#endif

若是咱们想在某个平台下,只编译某些文件,也是能够实现的:

<ItemGroup Condition=" '$(TargetFramework)' == 'net45' ">
    <Reference Include="System" />
    <Reference Include="Microsoft.CSharp" />
    <Compile Include="Platforms\net45\*.cs" />
</ItemGroup>

3、结语

说实话MSBuild的项目配置系统仍是比较灵活的,之后整个dotnet体系的构建过程也都获得了统一。在dotnet cli中也集成了msbuild,即dotnet build。

 

 

GitHub:https://github.com/maxzhang1985/YOYOFx 若是觉还能够请Star下, 欢迎一块儿交流。

.NET Core 开源学习群:214741894

相关文章
相关标签/搜索