解讀釋出:.NET Core RC2 and .NET Core SDK Preview 1

發表於2016-05-23

解讀釋出:.NET Core RC2 and .NET Core SDK Preview 1

先看一下 .NET Core(包含 ASP.NET Core)的路線圖:

  • Beta6: 2015年7月27日
  • Beta7: 2015年9月2日
  • Beta8: 2015年10月15日
  • RC1: 2015年11月
  • RC2 (Tools Preview 1): 2016年5月17日
  • 1.0.0 (Tools Preview 2): 最遲2016年6月份

.NET Core RC2 版本今天已經發布,但從 RC1 到 RC2 釋出間隔了大概半年的時間,這在微軟的釋出中還是很少見的,2016年2月份,微軟宣佈了 .NET Core RC2 的延遲釋出,雖然延遲釋出,但之後 .NET 社群中都是一致的聲音:希望微軟精耕細作,把 .NET Core 專心做好,而不是急著釋出出來,所以到現在是四個月的時間,微軟確實在真正耗費精力的把 RC2 版本做好,手動點個?!

為什麼 .NET Core RC1 到 RC2 釋出耗時這麼長時間?之前的新聞和文章已經介紹很多了,就不多說了,改變實在是大,其實你也可以從某種意義上看作是一個全新實現。

言歸正傳,在昨天凌晨的時候,微軟官方部落格釋出了幾篇文章,我覺得除了包含 .NET Core RC2 的釋出訊息以外,文章內容還是非常有價值的,從某些文字和某段話中,我們可以得到一些容易被忽略的東西,所以,這幾篇博文我又重新認真讀了下,希望把有些有價值的地方,分享給大家。

相關博文:

1. We will continue to make changes and stabilize the tooling until it RTMs with VS “15”.

  • .NET Core and ASP.NET Core 1.0 RC2, Tooling Preview 1
  • .NET Core and ASP.NET Core 1.0 RTM, Tooling Preview 2

Tooling 是什麼?這個後面說,當 ASP.NET Core 1.0 正式版釋出的時候,Tooling 的版本大概是 Preview 2,標題中的說明是在 ASP.NET Core 1.0 正式版釋出之後,Tooling 還會有一些改變,直到 Visual Studio “15” 的 RTM 版本釋出,現在 Visual Studio “15” 的版本是 Preview,相關介紹:Visual Studio “15” Preview Now Available,對於 Visual Studio “15”,你可以把它當作 ASP.NET Core 1.0 是 ASP.NET 的全新實現一樣,與 Visual Studio “15” 並行的版本是 Visual Studio 2015 Update 2,這兩個 Visual Studio 完全不一樣,從你電腦上可以同時安裝這兩個版本就可以看出,所以,Visual Studio “15” 是 Tooling 的重點,也是微軟下一步的重點。

另外,需要注意釋出時間,.NET Core 和 ASP.NET Core 1.0 正式版最遲釋出時間為2016年6月份(應該會在微軟的 dotnetConf 會議上釋出),但並不包含 Tooling 的正式版釋出,當 .NET Core 和 ASP.NET Core 1.0 正式穩定之後,下一步就是 Visual Studio “15”,包括 Tooling 中的其它工具(比如 CLI)。

2. How We Got Here

  • The ASP.NET team started two and a half years ago, building a new version of ASP.NET that was modular, cross platform, and high-performance. This new version of ASP.NET was built on a new .NET Execution Environment (DNX) that was optimized for modern cloud-focused workloads (websites, microservices, etc.). We shipped an RC1 of those bits in November.
  • After shipping ASP.NET Core 1.0 RC1, it was very important to broaden .NET Core to also support building native console applications. So we started the process of reworking the tool chain so it could be used to build .NET console, class libraries and server applications. This process has proved to be harder than we anticipated and led to us removing dates for RC2/RTM from our schedule in February.

上面是兩段話,我都貼出來了,我個人覺得很有價值,你可以從中揣摩微軟的心思和了解 ASP.NET 跨平臺的歷史。

首先,第一段話的意思:ASP.NET 團隊在兩年半之前就開始開發 ASP.NET 的跨平臺實現了,那時候被叫做 ASP.NET vNext,然後對應一個專門的執行時 XRE,然後被改名為 KRE,後來在 ASP.NET 5 RC1 的時候,又被改名為 DNX,需要注意的時候,DNX 執行時只適用於當時的 ASP.NET 5 RC1,並不適用於其它的微軟產品,所以,我們在當時的 Visual Studio 2015 中,看到建立 ASP.NET 5 的模版是獨立出來的,叫 ASP.NET 5 Web Application 和 ASP.NET 5 Class Library,ASP.NET 5 RC1 的釋出時間時2015年11月份。

上面都是前提介紹,重點在於第二段話,在 ASP.NET 5 RC1 釋出之後,微軟意識到 .NET Core 支援構建 Native Console Application 是非常重要(注意是 .NET Core,並不是 DNX),那時候的 .NET Core 是獨立於 ASP.NET 5 RC1 的,也就是 ASP.NET 5 RC1 的執行時並不是使用的 .NET Core,後來微軟開始重寫工具鏈,以支援構建 .NET console、Class Libraries 和 Server Applications,也就是把 .NET Core 和 DNX 統一起來,準確來說,就是把 DNX 歸到 .NET Core 中,並且對應的相應工具也要進行調整,比如那時候 ASP.NET 5 RC1 對應的工具是 dnvm 和 dnpm,現在來看,都歸到統一的 CLI 中了,並且 ASP.NET 5 的名稱也不太準確,會讓人誤以為是 ASP.NET 4.6 的進階版,但其實是 ASP.NET 的全新實現,所以,這個名稱需要改,最後確定改為 ASP.NET Core。

原本 ASP.NET Core RC2/RTM 的釋出是在2016年的2月份,但微軟在開發上面任務的時候,發現工作難度和工作量實在太大,所以就推遲了 ASP.NET Core RC2/RTM 的釋出,每件東西的改變,都有著背後的歷史,事出總有因,瞭解完這些背後的東西,我們就會更加體諒微軟了,並且,改變是進步的體現,需要點個贊?!

另外,RC1 升級到 RC2 相關文章:

3. Unifying the frameworks and the tooling

  • We also need to make it easy to work with projects across these application models. In order to do this we are working to merge the capabilities of .xproj/project.json and .csproj project systems into a single project system based on MSBuild. This transition will be automatic and will not require you to change your existing projects. This work will happen during the VS 15 release schedule and we will release another blog post with more details.

除了上面的這段話,關於“統一框架和工具”節點,還有兩句話,其意思就是統一構建(build)的方式,主要針對跨平臺應用程式。

現在針對 .xproj/project.json 和 .csproj 應用程式的構建是不同的,上面的意思就是統一基於 MSBuild 的構建方式,並且保證不影響現在已有的應用程式,這部分改進包含在 Visual Studio “15” 中,所以還是那句話,Visual Studio “15” 是微軟下一步的重點,我們需要重點關注下。

評論中關於這部分的討論很激烈?。

4. What does Preview mean?

Remember that .NET Core has two main parts:

  • The Runtime/Libraries – This is the CLR, libraries, compilers, etc.
  • The Tooling – This is all the support in the .NET Core command line tools, Visual Studio and Visual Studio Code that enable you to work with .NET Core projects.

上面這段不需要翻譯了,關於 .NET 跨平臺的很多概念,我們很容易搞混淆,比如 .NET Core, .NET Framework 等等,.NET Core 包含 CoreCLR,、CoreFx、編譯器、CLI、以及其它支援的工具,這裡的工具並不是直接指的是 Visual Studio 或 Visual Studio Code,而是他們能讓 .NET Core 應用程式執行的元件或工具。

We’re splitting the .NET Core “release train” so that those of you who are waiting can go live on .NET Core 1.0 RC2 with confidence, while we continue to deliver on our plans for the tooling:

  • The .NET Core 1.0 RC2 runtime is a true Release Candidate. It’s solid, stable, and it won’t change for RTM (except if something critical happens) and we feel good about it. It will have a “go-live” license, meaning you can get official support from Microsoft.
  • The tooling that supports .NET Core and ASP.NET Core, including the new command line tools and bits that plug into Visual Studio & Visual Studio Code, aren’t there yet. It’s going to change before it stabilizes. We’re going to call this tooling release Preview 1.

上面這段話包含的內容非常多,之前說了,.NET Core 其實是包含 Tooling 的,但這次 .NET Core RC2 的釋出,Tooling 對應的版本是 preview 1,所以就像標題那樣:.NET Core RC2 and .NET Core SDK Preview 1,微軟是把 .NET Core 和 Tooling 的版本釋出是分開的,雖然版本不一致,但其實都是 .NET Core,這一點容易混淆,需要明確下,總感覺微軟的這次釋出是不得不釋出的,就像他用了一個 splitting 詞一樣:分割釋出,一個東西,兩個版本

.NET Core 1.0 RC2 釋出出來後,基本上就不會再進行改了,所以,我們現在就可以放心的在專案中使用它了,之前的 RC1 確實是太大的坑,在現有的 .NET Core 1.0 RC1 專案中,升級到 .NET Core 1.0 RC2 版本,這個工作量我想是蠻大的。

下面那句話,再次說了 Tooling 包含的東西,需要注意的是,CLI 屬於 .NET Core,準確的來說,CLI 屬於 .NET Core 中的 Tooling,.NET Core 1.0 RC2 基本上不進行改了,具體指的是 CoreCLR,、CoreFx、編譯器,但 Tooling 還是會進行修改的,所以,CLI 可能會進行修改,現在的版本命名為 Tooling Preview 1。

5. ASP.NET Core is a console app

解讀釋出:.NET Core RC2 and .NET Core SDK Preview 1

This migration from a class library that is designed to be run on the DNX to a console application with a Program.cs and a Main method that can be run by a new .NET toolchain is one of the most significant changes that RC2 brings to ASP.NET Core.

上面這段敘述是概括性文字,在之前有幾段文字是詳細說明,ASP.NET Core 1.0 RC1 應用程式是 Class Library,並且專案中有一個Startup.cs檔案,DNX 對應的工具進行啟動它,而 ASP.NET Core 1.0 RC2 卻是 Console App,並且移除了Startup.cs增加了Program.cs檔案,為什麼要這樣改變?其實在上面的介紹中已經進行說明了,我個人覺得就是微軟將 DNX 和 .NET Core CLR 進行了統一,而導致了 ASP.NET Core 1.0 RC2 的改變,ASP.NET 跨平臺不應該對應一個獨立的 CLR 實現,它應該只是 .NET 跨平臺的一種,將 ASP.NET Core 1.0 改為 Console App 之後,就更加統一了,就像這句話一樣:This alignment means that a single .NET toolchain can be used for both .NET Core Console applications and ASP.NET Core applications.

解讀釋出:.NET Core RC2 and .NET Core SDK Preview 1

上面這張圖很好的表現了 .NET Core 和 .NET Core Applications 的關係,.NET Core 是金字塔的低層,是所有 .NET Core Applications 的基礎,再往上除了 ASP.NET Core 之外,還應該再加其它的 Applications,比如 .NET Core Console 等,Visual Studio 是開發它們的工具之一,位於金字塔的最上層。

6. Tooling Preview Support for .NET CLI

That’s exactly what we’ve done and packaged support for these tasks in Visual Studio to make use of the dotnet tool.

在 ASP.NET Core RC2 版本中,我們可以在命令列中使用 CLI 進行還原程式包、構建和執行等任務,Visual Studio 現在也整合了 CLI 工具,我們可以很方便的在 Visual Studio 中使用 CLI。

解讀釋出:.NET Core RC2 and .NET Core SDK Preview 1

7. Support for RC1 and RC2 projects

解讀釋出:.NET Core RC2 and .NET Core SDK Preview 1

如何從 RC1 升級到 RC2?在建立 ASP.NET Core 應用程式的時候,會在解決方案的 Solution Items 目錄下,生成一個global.json檔案,配置如下:

如果需要升級到 RC2,我們需要將 version 版本修改為1.0.0-preview1-002702,如果不對 sdk 進行配置的話,預設將會使用 RC2 版本的 NET CLI tools。

8. .NET Core Templates

解讀釋出:.NET Core RC2 and .NET Core SDK Preview 1

Visual Studio 2015 Update 2 中 .NET Core 專案模版如上圖,.NET Core 和 .NET Framework 的 Web Application 依舊是分隔的,下面還有相容版本的模版,“a .NET Core compatible class library that compiles to a NuGet package.”這句話不是太懂。

ASP.NET Core Web Application(.NET Framework) 模版的意思是,Windows 下的 .NET Core Web Application 專案,也就是隻適用於 Windows 平臺。

左邊 .NET Core 包含三個模版:

  • Class Library(.NET Core)
  • Console Application(.NET Core)
  • ASP.NET Core Web Application(.NET Core)

9. About Entity Framework Core RC2

For this reason, EF6.x will still be the most suitable choice for many applications.

哈哈,上面這句話是亮點,所以,對於 Entity Framework Core RC2 來說,還是有一些問題的,我們在開發新專案的時候,如果需要保證專案的穩定性,儘量還是使用 EF 6.x 版本,那什麼時候要用 Entity Framework Core RC2 呢?答案如下:

  • New applications that do not require features that are not yet implemented in EF Core
  • Applications that target .NET Core, such as Universal Windows Platform (UWP) and ASP.NET Core applications

總的來說,如果專案中使用的是 EF 6.x 版本,那最好不要升級到 EF Core RC2 版本,因為中間的差異還是蠻大的,當然,如果專案很小,也是可以升級的,另外,新的專案如果是 .NET Core,最好還是使用 EF Core RC2,EF Core RC2 支援以下構建方式:

EF Core RC2 支援的資料庫:

  • Microsoft SQL Server
  • SQLite
  • Postgres (Npgsql)
  • SQL Server Compact Edition
  • InMemory (for testing purposes)

EF Core RTM 版本需要進行的工作:

  • Bug fixing
  • Performance tuning
  • Documentation

EF Core RC2 因為我還沒用過,具體的特性還不清楚,但對於現在的版本,還是有一些問題的,簡單的新專案可以暫時使用,大型專案就算了。

10. .NET Core Tools

You typically start .NET Core development by installing the .NET Core SDK. The SDK includes enough software to build an app. The SDK gives you both the .NET Core Tools and a copy of .NET Core.

.NET Core SDK 和 .NET Core Tools 是什麼關係?SDK 有點文件的含義,你可以認為 .NET Core SDK 包含 .NET Core Tools,但現在 .NET Core SDK 只包含 .NET Core Tools,.NET Core Tools 中最重要的一個工具就是 CLI,除了一些預設的命令外,你也可以新增自定義的命名,詳見:simple extensibility model

CLI 命令如下(http://dotnet.github.io/docs/core-concepts/core-sdk/index.html):

  • dotnet new – Initializes a sample console C# project.
  • dotnet restore – Restores the dependencies for a given application.
  • dotnet build – Builds a .NET Core application.
  • dotnet publish – Publishes a .NET portable or self-contained application.
  • dotnet run – Runs the application from source.
  • dotnet test – Runs tests using a test runner specified in the project.json.
  • dotnet pack – Creates a NuGet package of your code.

關於單元測試使用 xUnit,詳見:Getting started with xUnit (.NET Core / ASP.NET Core)

The dotnet tool replaces the dnx and dnu tools that came with RC1. The dnvm tool doesn’t have a replacement yet. That’s something that might come in a later release.

dnx 和 dnu 已經被 dotnet 命名替換掉了,但 dnvm 並沒有,可能會出現在後面的釋出中,補充:dnvm 是管理 dnx 的命令,以後可能會新增針對 .NET Core CLR 版本的命令,只是現在還沒確定。

11. .NET Core App Types

We’ve talked to many customers about how they want to deploy apps. We heard two main models:

  • Deploy smaller apps that have a dependency on a centrally installed .NET Core version, perhaps used by multiple apps. We call this model “portable”.
  • Deploy larger self-contained apps that have no .NET Core dependencies. We call this model “self-contained”.

在 .NET Core RC1 版本的時候,應用程式檔案一般都是和執行時(包含基礎類庫)一塊打包的,放在釋出檔案的packages目錄下,雖然這樣有很多好處,比如執行時和基礎類庫是獨立的,並且在每個應用程式中都是隔離的,隔離的好處就是可以單獨進行管理,並且出現問題只在本應用程式中,但這樣的方式就會有個問題,應用程式的釋出檔案會很大。

上面的部署方式,稱之為“self-contained”(獨立性),在 .NET Core RC2 版本中,除了這種部署方式,還提供了一種叫“portable”(便攜性)的方式,這種就我們之前部署 ASP.NET 應用程式一樣了,只包含應用程式檔案,執行時和基礎類庫都放在統一的地方,以供不同的應用程式使用,兩種方式有好有壞,自己可以權衡使用。

12. NuGet Package References

.NET Core is a platform of packages. You can see how these packages are referenced in a set of simple .NET Core samples that we have published. There are two metapackages that you will typically reference in your project file, one or the other. One is for apps and libraries that will only run on .NET Core and the other for libraries that you intend to run on all .NET platforms.

.NET Core samples:https://github.com/dotnet/core/tree/master/samples

.NET Core 是平臺程式包,什麼意思?解釋在下面那句話,一般 .NET Core 應用程式中會包含兩種型別的程式包,一個是僅僅在 .NET Core 上跑的,另一個是你想跑在所有的 .NET 平臺,這兩種只能在應用程式中配置一種,這段描述看得我有些懵逼。

Most of the time, you will reference the Microsoft.NETCore.App package. This package represents the same set of libraries that are shipped with the various .NET Core installers. The .NET Core tools understand this reference and can use the locally installed copy of .NET Core instead of relying on the versions from NuGet.

Microsoft.NETCore.App程式包,一般在 .NET Core 應用程式中都需要進行引用的,.NET Core 會安裝很多不同的版本,它的作用就是,在應用程式中指定使用某一種 .NET Core 版本。

  • The .NET Standard Library is a new concept that represents the APIs available in all .NET implementations, at least those that support it. The .NET Framework, .NET Core and Mono/Xamarin will or already do support the .NET Standard Library. The .NET Standard Library can be thought of as the next version of Portable Class Libraries, but the set of APIs available and the way you create the libraries are much different.
  • The set of APIs exposed by the .NET Standard Library is currently smaller than we intend. In the next few releases, we intend to expand this set of libraries considerably to provide much more compatibility with the .NET Framework. We’ll publish more on this plan soon.

.NET Standard Library 是一個新的概念,它的特點就是更小,並且標準更加統一,後面 .NET Framework 都會慢慢使用這種標準進行釋出。

ASP.NET Core 1.0 RC2 中project.json示例配置:

13. .NET Core RC2 and .NET Core SDK Preview 1 Releases

釋出包含:

下載安裝地址:https://www.microsoft.com/net/core#windows ,如果安裝了 Visual Studio 2015 Update 2,只需要安裝兩個東西:

相關文章