Fork me on GitHub

解读发布:.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

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 和 .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。

7. Support for RC1 and RC2 projects

如何从 RC1 升级到 RC2?在创建 ASP.NET Core 应用程序的时候,会在解决方案的 Solution Items 目录下,生成一个global.json文件,配置如下:

{
  "projects": [ "src", "test" ],
  "sdk": {
    "version": "1.0.0-rc1-final"
  }
}

如果需要升级到 RC2,我们需要将 version 版本修改为1.0.0-preview1-002702,如果不对 sdk 进行配置的话,默认将会使用 RC2 版本的 NET CLI tools。

8. .NET Core Templates

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示例配置:

{
  "userSecretsId": "aspnet-WebApplication1-42c12a0f-14cf-4e10-b6ec-712743a0386b",

  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.0-rc2-3002702",
      "type": "platform"
    },
    "Microsoft.AspNetCore.Authentication.Cookies": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Diagnostics": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Mvc": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Razor.Tools": {
      "version": "1.0.0-preview1-final",
      "type": "build"
    },
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.StaticFiles": "1.0.0-rc2-final",
    "Microsoft.EntityFrameworkCore.SqlServer": "1.0.0-rc2-final",
    "Microsoft.EntityFrameworkCore.Tools": {
      "version": "1.0.0-preview1-final",
      "type": "build"
    },
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc2-final",
    "Microsoft.Extensions.Configuration.Json": "1.0.0-rc2-final",
    "Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc2-final",
    "Microsoft.Extensions.Logging": "1.0.0-rc2-final",
    "Microsoft.Extensions.Logging.Console": "1.0.0-rc2-final",
    "Microsoft.Extensions.Logging.Debug": "1.0.0-rc2-final",
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc2-final",
    "Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
      "version": "1.0.0-preview1-final",
      "type": "build"
    },
    "Microsoft.VisualStudio.Web.CodeGenerators.Mvc": {
      "version": "1.0.0-preview1-final",
      "type": "build"
    }
  },

  "tools": {
    "Microsoft.AspNetCore.Razor.Tools": {
      "version": "1.0.0-preview1-final",
      "imports": "portable-net45+win8+dnxcore50"
    },
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": {
      "version": "1.0.0-preview1-final",
      "imports": "portable-net45+win8+dnxcore50"
    },
    "Microsoft.EntityFrameworkCore.Tools": {
      "version": "1.0.0-preview1-final",
      "imports": [
        "portable-net45+win8+dnxcore50",
        "portable-net45+win8"
      ]
    },
    "Microsoft.Extensions.SecretManager.Tools": {
      "version": "1.0.0-preview1-final",
      "imports": "portable-net45+win8+dnxcore50"
    },
    "Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
      "version": "1.0.0-preview1-final",
      "imports": [
        "portable-net45+win8+dnxcore50",
        "portable-net45+win8"
      ]
    }
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dotnet5.6",
        "dnxcore50",
        "portable-net45+win8"
      ]
    }
  },

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },

  "runtimeOptions": {
    "gcServer": true
  },

  "publishOptions": {
    "include": [
      "wwwroot",
      "Views",
      "appsettings.json",
      "web.config"
    ]
  },

  "scripts": {
    "prepublish": [ "npm install", "bower install", "gulp clean", "gulp min" ],
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }
}

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

发布包含:

下载安装地址:https://www.microsoft.com/net/core#windows ,如果安装了 Visual Studio 2015 Update 2,只需要安装两个东西:

posted @ 2016-05-17 22:01  田园里的蟋蟀  阅读(3180)  评论(15编辑  收藏  举报