.net core項目結構與發布
本文的目的是記錄與分享自己的學習過程和個人你的看法。如果對你有任何幫助深感榮幸,若有任何紕漏煩請指正。
我們通過一個簡單的項目了解 .net core的項目結果和發布過程。使用 .net core2.1 sdk來創建一個最簡單的C#項目,你可以去下面這個鏈接下載SDK。
.NET SDK下載使用版本為2.1.4
安裝完成之後,運行dotnet new命令可以查看可以創建的項目,它顯示了可創建的項目類型以及支持的語言。
要創建一個項目,首先需要一個用來存放項目的文件夾比如myapp。
然後進入文件夾,創建一個console項目就運行命令行dotnet new console,如果要創建其他項目比如F#的 MVC項目就可以用命令dotnet new mvc -lang f#。
當創建好模版後可以看到SDK還會執行dotnet restore命令,這個命令用於還原項目的依賴,更詳細內容可轉到下面的鏈接。
dotnet restore 命令- .NET Core CLI這樣就創建好了一個語言為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完整的項目文件格式參考可以在下面的鏈接中找到。
MSBuild Project File Schema Reference - Visual StudioProgam.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 開發工具開始寫代碼!
寫完代碼就可以測試運行,在項目文件下運行dotnet run。
當你完成項目開發後就可以發布項目了,.net core項目發布有兩種常見的方式:
Framework-dependent deployment(FDD)/框架依賴部署
這種部署方式最明顯的特點就是需要在目標系統上安裝 .net core運行時,這也是它最大的缺點。它的優點包括你在發布時不需要指定你的目標平台,並且你的發布包的體積會更小,也可以節省你目標系統上的磁碟空間,因為多個 .net core程序可以使用一個Runtime。
可以直接在項目文件夾下運行dotnet publish -c Release命令行來執行發布。
dotnet publish 命令 - .NET Core CLI你也可以選擇直接在vistual studio生成,可以看到vs也是使用MSBuild工具來生成項目。
發布完成後,我們可以在發布目錄inRelease
etcoreapp2.0publish里看到結果。
其中myapp.dll為項目生成的託管程序集(Managed Assembly)文件,通俗的說就是程序本體。
myapp.pdb全稱為program database (PDB) symbol file,這個文件存儲了對應dll內部的所有符號,以及符號對應的地址、文件名和行號,這些信息會在調試時被用以提供可讀的調試信息。要了解更多細節可前往
PDB Symbol Filesmyapp.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到此,FDD方式的發布方式結束,你可以在安裝運行時的系統上運行 dotnet myapp.dll來運行程序。
Self-contained deployment(SCD)/自包含部署
SCD就是在發布時SDK將Runtime也做為部署包內容的一部分,這樣你就不需要在目標系統上安裝 .net core運行時了。但是這樣就需要你在發布時指定你要發布到的平台是什麼,這個在 .net core里叫做RID(Runtime IDentifier/運行時標識符),比如windows10 x64系統就是win10-x64
,全部的RID可以在下面鏈接里找到
它也是包管理的關鍵配置之一,以後在學習nuget的時候會碰到,本篇不做更多闡述。
在確定我們要發布到的平台後就可以使用命令行dotnet publish -r win10-x64 -c Release2 如果沒有錯誤那我們就發布成功了!
在發布文件夾下我們可以看到很多文件,這其中就包含了 .net core運行時,而且包含了一個項目對應平台的可執行文件myapp.exe,(其他平台上則會有對應的執行文件,比如選擇rhel後會生成一個不帶後綴的myapp文件)這樣我們就可以直接雙擊myapp.exe來執行了,哈利路亞!
當然這樣的本地化程序體驗也是有代價的,我們來看下以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到此我們簡單介紹了 .net core的項目結構與發布方式。希望以後會有更多其他平台的開發者選擇 .net core,因為C#真的是很優秀的語言啊!
都看到這了還不點贊關注走一波((o(^_ ^)o))。
推薦閱讀:
※哪些體檢項目是每年都該做的?
※大客戶生意,走心還是走腎?(1) - 《從零開始做銷售》
※如何看待Doogo研發電子導盲犬項目?
※項目申報那攤事······
※神秘的2999元收費項目課程被我這樣破解了...