Update to .NET 8
Intro
.NET 8 正式版发布已有一周多了,有些应用已经升级了 .NET 8,有些有依赖 Roslyn 的 package,最近才更新,所以有部分刚升级,分享一下升级到 .NET 8 的过程,相对比较简单,仅供参考
TargetFramework Update
首先要更新的就是项目文件里的 TargetFramework
为 net8.0
,然后 .NET 相关的 package 更新到 8.0.0
版本,对于某些非常简单的应用来说可能就足够了,完~
项目较多把 TargetFramework 可以放在一个 Directory.Build.props 中,移除项目文件里的,这样可能更新一行代码就可以了
再看些复杂一些的
.NET 8 SDK 默认包含了 source link,所以之前项目里引用了 Microsoft.SourceLink.GitHub
升级之后可以去掉了,SDK 里默认包含了,.NET 8 里默认支持 source link,无需做任何改动
默认支持
GitHub or GitHub Enterprise
Azure Repos git repositories (formerly known as Visual Studio Team Services)
GitLab 12.0+ (for older versions see GitLab settings)
Bitbucket 4.7+ (for older versions see Bitbucket settings)
可以参考:https://github.com/dotnet/sourcelink/#using-source-link-in-net-projects
另外从 .NET 8 开始默认的 dotnet pack
和 dotnet publish
会使用 Release 模式,而非之前的 Debug 模式,对于之前手动指定 -c Release
的命令可以简化一下,可以不用指定,不过不更新也不会有问题~~
CI Update
目前用的 CI 主要是 Azure DevOps 和 Github Actions
Azure DevOps
- task: UseDotNet@2
displayName: 'Use .NET sdk'
inputs:
packageType: sdk
- version: 7.0.x
+ version: 8.0.x
更新 SDK version 到 8.0.x
或者 8.x
可以自动获取最近的 .NET 8 的 SDK
Github Actions
- name: Setup .NET SDK
uses: actions/setup-dotnet@v3
with:
- dotnet-version: 7.0.x
+ dotnet-version: 8.0.x
如果你的项目是多个 target framework 的,常见的是一些类库应用,可能是增加了 .NET 8 的 sdk,可以同时指定多个版本,示例如下:
- name: Setup .NET SDK
uses: actions/setup-dotnet@v3
with:
dotnet-version: |
6.0.x
8.0.x
Container Update
更新 docker image tag 为 8.0
- FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
+ FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
+ ENV ASPNETCORE_HTTP_PORTS=80
- FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env
+ FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
这里中间有一个 ASPNETCORE_HTTP_PORTS
环境变量的配置,因为 .NET 8 container 里默认的端口号变成了 8080
,可以设置这一环境变量以保持使用 80
端口,这样可以不需要修改 k8s 里的 deployment 和 service 的端口配置
引入这一变化的原因在于,dotnet team 想要支持 non-root user,而 80 端口需要高级权限,所以默认端口号改成了 8080
普通用户也可以使用这一端口号,另外在 8.0 的 container 中引入了一个新的 user app
没有 root
权限
可以参考微软的 Dockerfile: https://github.com/dotnet/dotnet-docker/blob/2e4b5915486c96b4e5f7d49b01a767301f661790/src/runtime-deps/8.0/jammy/amd64/Dockerfile#L3
如果想要使用 8080 端口和 non-root user 的话,可以在 Dockerfile 中在 runtime image 中添加
USER app
即可启用 non-root user,需要注意的是如果启用 non-root user, 权限将会收紧,将无法在 container 里通过命令去安装新的 package
对于我们常用的一些工具如 curl 等如果需要建议在 Dockerfile 中增加一个 step 去安装
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
curl \
git \
&& rm -rf /var/lib/apt/lists/*
USER app
另外就是前面提到的 container 的 port 变成了 8080,需要修改别的服务调用的地址或者 k8s resource 中 container port
如果是一个全新的服务,建议使用 8080 端口并且启用 app
用户,老的服务可以根据自己的需要进行调整
WPF Update
除了前面提到的框架版本和包版本的更新之外,在之前的版本中想要使用选择文件或者目录窗体的话在 WPF 中需要引用 Winform 的窗体,需要在项目文件中指定 <UseWindowsForms>true</UseWindowsForms>
并使用 System.Windows.Forms.FolderBrowserDialog
等
.NET 8 开始引入了 WPF 中的文件对话框,可以不再需要引用 winform 中的组件了
.NET 8 之前的代码如下:
var dialog = new System.Windows.Forms.FolderBrowserDialog
{
Description = _localizer["ChooseDirTip"],
ShowNewFolderButton = true
};
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
return dialog.SelectedPath;
}
更新到 .NET 8 之后的代码如下:
var dialog = new OpenFolderDialog()
{
Title = _localizer["ChooseDirTip"]
};
if (dialog.ShowDialog() == true)
{
return dialog.FolderName;
}
项目文件中的 <UseWindowsForms>true</UseWindowsForms>
也移除了,可以参考 commit:
https://github.com/WeihanLi/DbTool/commit/3f6e1f99c9ac948c72afe21fd4abe95af8b9a382
More
你在升级 .NET 8 的过程中有没有遇到什么问题呢?一起来分享一下吧~~
References
https://github.com/WeihanLi/DbTool.Packages/pull/8/files
https://github.com/night-moon-studio/NatashaPad/pull/18
https://github.com/WeihanLi/WeihanLi.Extensions.Localization.Json/pull/5
https://github.com/WeihanLi/DbTool/commit/3f6e1f99c9ac948c72afe21fd4abe95af8b9a382
https://github.com/OpenReservation/ReservationServer/commit/6c649e690133885b80cd6474a6c39a693c056308
https://github.com/OpenReservation/ReservationServer/commit/cdf4e54fa255a115539f4b04b2b17e919202030f
https://github.com/WeihanLi/XunitDependencyInjection.Samples/commit/7fa7534b35c2404adb41b6c3f4da183df080bb59
https://github.com/dotnet/dotnet-docker/blob/2e4b5915486c96b4e5f7d49b01a767301f661790/src/runtime-deps/8.0/jammy/amd64/Dockerfile#L3
https://devblogs.microsoft.com/dotnet/announcing-dotnet-chiseled-containers/
https://github.com/dotnet/sourcelink/#using-source-link-in-net-projects
https://learn.microsoft.com/en-us/dotnet/core/compatibility/8.0