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 正式发布之后应该用
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

后来发现别人也有遇到这个问题,用完整的 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 用户

可以参考:
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 来安装

调用 Random Shuffle API 示例
