.net core項目結構與發布

本文的目的是記錄與分享自己的學習過程和個人你的看法。如果對你有任何幫助深感榮幸,若有任何紕漏煩請指正。


我們通過一個簡單的項目了解 .net core的項目結果和發布過程。使用 .net core2.1 sdk來創建一個最簡單的C#項目,你可以去下面這個鏈接下載SDK。

.NET SDK下載?

www.microsoft.com圖標

使用版本為2.1.4

安裝完成之後,運行dotnet new命令可以查看可以創建的項目,它顯示了可創建的項目類型以及支持的語言。

dotnet new

要創建一個項目,首先需要一個用來存放項目的文件夾比如myapp。

然後進入文件夾,創建一個console項目就運行命令行dotnet new console,如果要創建其他項目比如F#的 MVC項目就可以用命令dotnet new mvc -lang f#。

當創建好模版後可以看到SDK還會執行dotnet restore命令,這個命令用於還原項目的依賴,更詳細內容可轉到下面的鏈接。

dotnet restore 命令- .NET Core CLI?

docs.microsoft.com圖標

這樣就創建好了一個語言為C#的console項目模版,項目里包含了下面的內容。

其中obj文件夾包含了編譯與生成時需要的和產生的中間文件,一般不需要關注。

myapp.csproj即項目文件(其他語言的項目文件後綴F#為.fsproj,VB為vbproj 這和1.x版本中使用project.json等文件來組織和配置項目的方式完全不同),這個文件是項目組織和配置的核心,會在生成時被MSBuild用來作為輸入。csproj文件的本質是一個保存項目信息的xml文件,打開它我們可以看到以下內容

<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.0</TargetFramework> </PropertyGroup></Project>

其中OutputType指定了當前項目的類型,TargetFramework指定了當前項目所用的框架,全部的TargetFramework支持項可以在下面找到,但當前對於非類庫的 .net core項目支持的只有netcoreapp1.0,netcoreapp1.1,netcoreapp2.0,我們使用2.1版本所以應當是netcoreapp2.0,別問為什麼 <( ̄3 ̄)> 。

Target frameworks?

docs.microsoft.com圖標

完整的項目文件格式參考可以在下面的鏈接中找到。

MSBuild Project File Schema Reference - Visual Studio?

docs.microsoft.com圖標

Progam.cs就是程序的代碼文件,裡面已經寫了一段最基本的HelloWord代碼,將它改成Hello Zhihu!,並添加一行控制台讀取代碼。

using System;namespace myapp{ class Program { static void Main(string[] args) { Console.WriteLine("Hello Zhihu!"); Console.ReadLine(); } }}

現在你可以使用適合你的開發工具進行開發了,微軟推薦的開發工具可以在下面鏈接看到,個人推薦Vistual Studio Community版,好用不要錢!。

.NET 開發工具?

www.microsoft.com圖標

開始寫代碼!

寫完代碼就可以測試運行,在項目文件下運行dotnet run。

我他娘的真是個天才!

當你完成項目開發後就可以發布項目了,.net core項目發布有兩種常見的方式:

Framework-dependent deployment(FDD)/框架依賴部署

這種部署方式最明顯的特點就是需要在目標系統上安裝 .net core運行時,這也是它最大的缺點。它的優點包括你在發布時不需要指定你的目標平台,並且你的發布包的體積會更小,也可以節省你目標系統上的磁碟空間,因為多個 .net core程序可以使用一個Runtime。

可以直接在項目文件夾下運行dotnet publish -c Release命令行來執行發布。

dotnet publish 命令 - .NET Core CLI?

docs.microsoft.com圖標

你也可以選擇直接在vistual studio生成,可以看到vs也是使用MSBuild工具來生成項目。

發布完成後,我們可以在發布目錄inRelease
etcoreapp2.0publish里看到結果。

其中myapp.dll為項目生成的託管程序集(Managed Assembly)文件,通俗的說就是程序本體。

myapp.pdb全稱為program database (PDB) symbol file,這個文件存儲了對應dll內部的所有符號,以及符號對應的地址、文件名和行號,這些信息會在調試時被用以提供可讀的調試信息。要了解更多細節可前往

PDB Symbol Files?

docs.microsoft.com圖標

myapp.deps.json和myapp.runtimeconfig.json兩個文件對於之前的 .net開發者會很陌生,

myapp.runtimeconfig.json是一個可選的配置文件包含了運行時的配置信息。這個文件被設計為是用戶可編輯的,你可以通過配置它來改變運行時的行為。

myapp.deps.json文件保存一個依賴的列表,也就是編譯上下文數據和編譯依賴,不是技術上需要的,但是在使用服務,包緩存或共享這些安裝功能的時候是需要的。(不知道翻譯對不對,看原文吧)。這個文件由程序進行處理和使用,用戶不應編輯。

MyApp.runtimeconfig.json - An optional configuration file containing runtime configuration settings.

MyApp.deps.json - A list of dependencies, as well as compilation context data and compilation dependencies. Not technically required, but required to use the servicing or package cache/shared package install features.

更詳細的信息可在dotnet cli的github項目找到

dotnet/cli runtime configuration file?

github.com圖標

到此,FDD方式的發布方式結束,你可以在安裝運行時的系統上運行 dotnet myapp.dll來運行程序。

Self-contained deployment(SCD)/自包含部署

SCD就是在發布時SDK將Runtime也做為部署包內容的一部分,這樣你就不需要在目標系統上安裝 .net core運行時了。但是這樣就需要你在發布時指定你要發布到的平台是什麼,這個在 .net core里叫做RID(Runtime IDentifier/運行時標識符),比如windows10 x64系統就是win10-x64,全部的RID可以在下面鏈接里找到

dotnet/corefx?

github.com圖標

它也是包管理的關鍵配置之一,以後在學習nuget的時候會碰到,本篇不做更多闡述。

在確定我們要發布到的平台後就可以使用命令行dotnet publish -r win10-x64 -c Release2 如果沒有錯誤那我們就發布成功了!

在發布文件夾下我們可以看到很多文件,這其中就包含了 .net core運行時,而且包含了一個項目對應平台的可執行文件myapp.exe,(其他平台上則會有對應的執行文件,比如選擇rhel後會生成一個不帶後綴的myapp文件)這樣我們就可以直接雙擊myapp.exe來執行了,哈利路亞!

老.net framework開發者想哭。

當然這樣的本地化程序體驗也是有代價的,我們來看下以win-x64為目標平台的兩種發布方式發布包的體積。

可以看到SCD的發布方式比FDD的方式會多62MB。所以選擇哪種方式發布需要看你項目的具體需求。

除了以上兩種常用的發布方式,.net core還有另外一種「黑科技」發布方式 AOT(ahead of time)。上面介紹的兩種方式除了SCD方式的exe文件外,項目的dll均為位元組碼(CIL Byte Code),也就是Roslyn編譯後的程序集。.net core從源代碼到用於執行的機器碼的順序為:源代碼->編譯時的Roslyn編譯為位元組碼程序集->運行時的JIT(即時編譯器)編譯為機器碼(Machine Code)->執行,而AOT的方式是將運行時的JIT編譯放在編譯時,所以你發布後的dll包含的是機器碼。可以一定程度的提高運行效率。更詳細的信息可以在下面的鏈接找到。

dotnet/corert?

github.com圖標

到此我們簡單介紹了 .net core的項目結構與發布方式。希望以後會有更多其他平台的開發者選擇 .net core,因為C#真的是很優秀的語言啊!

都看到這了還不點贊關注走一波((o(^_ ^)o))。


推薦閱讀:

哪些體檢項目是每年都該做的?
大客戶生意,走心還是走腎?(1) - 《從零開始做銷售》
如何看待Doogo研發電子導盲犬項目?
項目申報那攤事······
神秘的2999元收費項目課程被我這樣破解了...

TAG:跨平台 | C編程 | 互聯網 | 微軟Microsoft | 項目 | 科技 |