初尝 .NET 8 Preview 1

Intro

.NET 8 的第一个 preview 版本发布了,.NET 8 是新的 LTS 版本,有三年的长期支持,体验一下 .NET 8 preview 1 看看引入进来的变化

Install

Windows 上推荐使用 winget 进行安装,后续更新也会比较方便.

使用 winget install Microsoft.DotNet.SDK.Preview 进行安装,使用 winget upgrade Microsoft.DotNet.SDK.Preview 进行更新

winget install Microsoft.DotNet.SDK.Preview

初尝 .NET 8 Preview 1

install snapshot

初尝 .NET 8 Preview 1

.NET 8 正式发布之后应该用 winget install Microsoft.DotNet.SDK.8 来安装

其他方式可以参考官网介绍:下载 .NET 8.0 (Linux、macOS 和 Windows) (microsoft.com)

CI

目前用的比较多的是 Github Actions 和 Azure Pipelines

Azure pipelines 比较简单和之前一致:

- task: UseDotNet@2
  displayName: 'Use .NET sdk'
  inputs:
    packageType: sdk
    version: 8.0.x
    includePreviewVersions: true

把 version 改一下就可以了,Github actions 稍有不同,Github actions 如果使用 8.0.x 这种version 会失败,会找不到 package 不清楚 Azure pipeline 是不是做了什么特殊的处理,Github actions 需要指定具体的版本,如下所示:

- name: Setup .NET SDK
  uses: actions/setup-dotnet@v3
  with:
    dotnet-version: |
      6.0.x
      7.0.x
      8.0.100-preview.1.23115.2 

失败的 CI 示例:https://github.com/WeihanLi/SparkTodo/actions/runs/4243107754/jobs/7375429465

初尝 .NET 8 Preview 1

failed CI

后来发现别人也有遇到这个问题,用完整的 version 就可以了,可以参考 issue:.NET 8.0 Preview 1 · Issue #8213 · dotnet/core (github.com)

Docker image

.NET 8 对 docker 镜像做了较大的调整,我们一起看下吧

镜像 tag

首先镜像的 tag 变了,目前的策略是 RC 版本之前的 preview 版本对应的 image tag 都要加上 preview,比如:8.0-preview/8.0-preview-alpine 等

详细 tag 列表可以参考:

dotnet-docker/supported-tags.md at main · dotnet/dotnet-docker · GitHub

https://github.com/dotnet/dotnet-docker/blob/main/README.sdk.md#full-tag-listing

非 root 用户的支持

在之前的版本中,docker 镜像里只有一个 root 用户,从 8.0 开始引入了一个 app 的用户,有些 docker 镜像安全扫描工具会认为使用 root 用户是不安全的,从安全的角度来说这算是一个改进吧,如果使用非 root 用户

初尝 .NET 8 Preview 1

可以参考:

https://github.com/dotnet/dotnet-docker/blob/0f7ed9ce44b4aff3456b152b8cb4441c0617c120/src/runtime-deps/8.0/jammy/amd64/Dockerfile#L17

https://github.com/dotnet/dotnet-docker/blob/0f7ed9ce44b4aff3456b152b8cb4441c0617c120/src/runtime-deps/8.0/alpine3.17/amd64/Dockerfile#L14

ASP.NET Http port

从前面的截图可以看到有一个 ASPNETCORE_HTTP_PORTS 的环境变量,在 .NET 8 中我们只配一个端口就可以了,不用写那么长的 url 了,另外可以看到端口号是 8080,这对于 ASP.NET Core 应用来说需要格外注意的一个地方,默认的端口原来的 80 端口变成了 8080,因为 80 端口需要权限,app 用户没有 root 权限,如果需要使用 80 端口,仍需使用 root 用户并且在 Dockerfile 里配置端口为 80,如下所示:

ENV ASPNETCORE_HTTP_PORTS=80

如果想要使用 app 用户,则需要改外部的配置,容器的端口号从 80 改为 8080

USER app

More

之前做的一个小工具 dotnet-execute 也提供了 .NET 8 的支持,感兴趣的话可以用它来尝试一些新的 API,可以使用 dotnet tool update -g dotnet-execute --prerelease 来安装

初尝 .NET 8 Preview 1

调用 Random Shuffle API 示例

初尝 .NET 8 Preview 1