使用 Snap 包安装 .NET SDK 或 .NET Runtime。 对于内置于 Linux 发行版的包管理器而言,Snap 是一种很好的替代方法。 本文介绍如何通过
Snap
安装 .NET。
Snap 是应用及其依赖项的捆绑包,无需修改即可在多个不同的 Linux 发行版中正常运行。 可以从 Snap Store 中发现和安装 Snap。 若要详细了解 Snap,请参阅
开始使用 Snap
。
Windows 上的 WSL2 不支持 Snap 包。 作为替代方法,可使用
dotnet-install
脚本
或特定 WSL2 发行版的包管理器。 虽然可以尝试使用
Snapcraft 论坛中的替代方法
启用 Snap,但该方法不受支持,因此不建议这样做。
.NET 的 Snap 安装可能会遇到运行
.NET 工具
的问题。 如果要使用 .NET 工具,建议使用
dotnet-install
脚本
或特定 Linux 发行版的包管理器来安装 .NET。
当通过 Snap 安装 .NET 时,
dotnet watch
命令不起作用是一个已知问题。
如果要使用 .NET 工具或
dotnet watch
命令,建议使用
dotnet-install
脚本
安装 .NET。
.NET 版本
有两种类型的受支持版本:长期支持 (LTS) 版本或标准期限支持 (STS) 。 所有版本的质量都是一样的。 唯一的区别是支持的长度。 LTS 版本可获得 3 年的免费支持和修补程序。 STS 版本获得 18 个月的免费支持和修补程序。 有关详细信息,请参阅
.NET 支持策略
。
下表列出了每个版本的 .NET (和 .NET Core) 的支持状态:
✔️ 受支持
❌ 不受支持
SDK 或 Runtime
如果要开发 .NET 应用,请安装 SDK(包括运行时)。 或者,如果只需运行应用程序,请安装运行时。 如果要安装该运行时,建议安装 ASP.NET Core 运行时,因为它同时包括 .NET 和 ASP.NET Core 运行时。
使用
dotnet --list-sdks
和
dotnet --list-runtimes
命令查看安装的版本。 有关详细信息,请参阅
如何检查是否已安装 .NET
。
安装 SDK
适用于 .NET SDK 的 Snap 包都是在同一标识符(即
dotnet-sdk
)下发布的。 可以通过指定通道来安装特定版本的 SDK。 SDK 包括相应的运行时。 下表列出了通道:
.NET 版本
Snap 包或通道
若要安装适用于 .NET SDK 的 Snap 包,请运行
snap install
命令。 使用
--channel
参数来指明要安装哪个版本。 如果省略此参数,则使用
latest/stable
。 在下面的示例中,指定的是
7.0
:
sudo snap install dotnet-sdk --classic --channel=7.0
接下来,使用 snap alias 命令为系统注册 dotnet 命令:
sudo snap alias dotnet-sdk.dotnet dotnet
此命令的格式为 sudo snap alias {package}.{command} {alias}。 可以选择所需的任何 {alias} 名称。 例如,可以根据 Snap 安装的特定版本来命名此命令:sudo snap alias dotnet-sdk.dotnet dotnet70。 运行命令 dotnet70 时,将调用这一特定版本的 .NET。 但选择其他别名与大多数教程和示例不兼容,因为它们需要使用 dotnet 命令。
安装运行时
适用于 .NET Runtime 的 Snap 包都是在各自的包标识符下发布的。 下表列出了这些包标识符:
.NET 版本
Snap 包
若要安装适用于 .NET Runtime 的 Snap 包,请运行 snap install 命令。 在此示例中,已安装 .NET 7:
sudo snap install dotnet-runtime-70 --classic
接下来,使用 snap alias 命令为系统注册 dotnet 命令:
sudo snap alias dotnet-runtime-70.dotnet dotnet
此命令的格式为 sudo snap alias {package}.{command} {alias}。 可以选择所需的任何 {alias} 名称。 例如,可以根据 Snap 安装的特定版本来命名此命令:sudo snap alias dotnet-runtime-70.dotnet dotnet70。 运行命令 dotnet70 时,将调用特定版本的 .NET。 但选择其他别名与大多数教程和示例不兼容,因为它们需要使用 dotnet 命令。
导出安装位置
DOTNET_ROOT 环境变量经常被工具用来确定 .NET 的安装位置。 通过 Snap 安装 .NET 时,不配置此环境变量。 应在配置文件中配置 DOTNET_ROOT 环境变量。 Snap 的路径采用以下格式:/snap/{package}/current。 例如,如果你安装了 dotnet-sdk Snap,则使用以下命令将环境变量设置为 .NET 所在的位置:
export DOTNET_ROOT=/snap/dotnet-sdk/current
前面的 export 命令只为运行它的终端会话设置环境变量。
你可以编辑 shell 配置文件,永久地添加这些命令。 Linux 提供了许多不同的 shell,每个都有不同的配置文件。 例如:
Bash Shell:~/.bash_profile、~/.bashrc
Korn Shell:~/.kshrc 或 .profile
Z Shell:~/.zshrc 或 .zprofile
为 shell 编辑相应的源文件并添加 export DOTNET_ROOT=/snap/dotnet-sdk/current。
TLS/SSL 证书错误
通过 Snap 安装 .NET 后,可能会在某些发行版上找不到 .NET TLS/SSL 证书,并且可能会在 restore 期间看到以下错误:
Processing post-creation actions...
Running 'dotnet restore' on /home/myhome/test/test.csproj...
Restoring packages for /home/myhome/test/test.csproj...
/snap/dotnet-sdk/27/sdk/2.2.103/NuGet.targets(114,5): error : Unable to load the service index for source https://api.nuget.org/v3/index.json. [/home/myhome/test/test.csproj]
/snap/dotnet-sdk/27/sdk/2.2.103/NuGet.targets(114,5): error : The SSL connection could not be established, see inner exception. [/home/myhome/test/test.csproj]
/snap/dotnet-sdk/27/sdk/2.2.103/NuGet.targets(114,5): error : The remote certificate is invalid according to the validation procedure. [/home/myhome/test/test.csproj]
若要解决此问题,请设置一些环境变量:
export SSL_CERT_FILE=[path-to-certificate-file]
export SSL_CERT_DIR=/dev/null
证书位置因发行版而异。 下面是我们在发行版中遇到此问题的位置。
解析 dotnet 时的问题
其他应用(例如适用于 Visual Studio Code 的 OmniSharp 扩展)通常会尝试解析 .NET SDK 的位置。 一般情况下,这是通过确定可执行文件 dotnet 所在的位置完成的。 Snap 安装的 .NET SDK 可能会混淆这些应用。 当这些应用无法解析 .NET SDK 时,你将看到类似于以下消息之一的错误:
找不到指定的 SDK 'Microsoft.NET.Sdk'
找不到指定的 SDK 'Microsoft.NET.Sdk.Web'
找不到指定的 SDK 'Microsoft.NET.Sdk.Razor'
若要解决此问题,请将 Snap 可执行文件 dotnet 符号链接到程序正在查找的位置。 dotnet 命令要查找的两个常见路径是 /usr/local/bin/dotnet 和 /usr/share/dotnet。 例如,若要链接当前的 .NET SDK Snap 包,请使用以下命令:
ln -s /snap/dotnet-sdk/current/dotnet /usr/local/bin/dotnet
还可以查看这些 GitHub 问题,了解有关这些问题的信息:
SDK 解析程序不能与 Linux 上的 SDK Snap 安装一起运行
找不到任何已安装的 .NET SDK
dotnet 别名
如果为 Snap 安装的 .NET 创建了别名 dotnet,则可能会发生冲突。 使用 snap unalias dotnet 命令将其删除,然后根据需要添加其他别名。
如何为 .NET CLI 启用 Tab 自动补全
教程:使用 Visual Studio Code 通过 .NET SDK 创建控制台应用程序