.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

相關文章
相關標籤/搜索