返回

Linux 如何命令行安装 NuGet 包?(.NET CLI/Mono 方案)

Linux

Linux 命令行搞定 NuGet 包安装

一、 问题来了:Linux 上怎么用命令行装 NuGet 包?

不少开发者在 Windows 上用 NuGet 挺顺手的,一个 nuget install packages.config 命令就能把项目依赖的包给拉下来。但把开发环境换到 Linux 后,发现老办法不灵了。直接在 Linux 终端里敲这个命令,系统会告诉你找不到 nuget 这个命令,或者就算想办法跑起来了也可能遇到其他问题。

那么,在 Linux 系统上,该怎么通过命令行来安装 packages.config 文件里列出的 NuGet 包呢?这篇就来聊聊怎么解决。

二、 为啥 Windows 行,Linux 不行?

这事儿得从 nuget.exe 说起。

你在 Windows 上常用的那个 nuget 命令,对应的其实是 nuget.exe 这个可执行文件。它是微软用 .NET Framework 写的,是个原生的 Windows 程序。要在 Linux 上直接运行它,那肯定不行,系统根本不认识。

不过,故事没这么简单。现在 .NET 的世界已经进化了,有了跨平台的 .NET Core 和后续的 .NET 5/6/7/8... 这个新体系自带了一个强大的命令行工具——.NET CLI,也就是你经常见到的 dotnet 命令。它才是管理 .NET 项目(包括 NuGet 包)的跨平台标准姿势。

当然,也不是说 nuget.exe 在 Linux 上就彻底没戏。借助 Mono 这个项目(一个开源的 .NET Framework 实现),理论上也能在 Linux 上跑 nuget.exe。但这通常不是首选方案,特别是对于现代 .NET 项目来说。

总结一下原因:

  1. nuget.exe 是 Windows 程序,Linux 原生不支持。
  2. 现代 .NET 开发推荐使用跨平台的 .NET CLI (dotnet 命令) 来管理包。
  3. 可以通过 Mono 运行 nuget.exe,但属于特定场景下的备选方案。

三、 解决方案:安排!

知道了原因,解决起来就有方向了。主要有两个路子:一个是跟着时代走,用 .NET CLI;另一个是稍微折腾下,用 Mono 配 nuget.exe

方案一:拥抱 .NET CLI (推荐)

这是最推荐、也是面向未来的做法。只要你的项目是基于 .NET SDK(包括 .NET Core, .NET 5+)构建的,用 dotnet 命令管理 NuGet 包就对了。

1. 原理是啥?

.NET CLI 的核心命令之一是 dotnet restore。这个命令会分析你的项目文件(通常是 .csproj 或解决方案文件 .sln),找出项目依赖的所有 NuGet 包,然后从配置好的包源(比如官方的 nuget.org 或者私有源)把这些包下载到本地缓存,并在项目里建立引用。

重要的是,dotnet restore跨平台 的,Windows、macOS、Linux 通吃。它不仅能处理现代项目文件里 <PackageReference> 方式声明的依赖,也能兼容处理旧格式的 packages.config 文件。

2. 怎么操作?

前提是你得先在 Linux 上装好 .NET SDK。可以通过包管理器(如 apt, yum, dnf)安装,或者去微软官网下载安装脚本。装好后,打开终端验证一下:

dotnet --version

能看到版本号就说明装好了。

接下来,进入包含你的项目文件(.csproj)或解决方案文件(.sln)的目录。

  • 如果你的依赖是通过 .csproj.sln 管理的(推荐方式):

    # 切换到包含 .sln 文件或 .csproj 文件的目录
    cd /path/to/your/project_or_solution_directory
    
    # 执行恢复命令
    dotnet restore
    

    或者,如果你只想针对特定的解决方案或项目文件:

    dotnet restore YourSolution.sln
    # 或者
    dotnet restore YourProject/YourProject.csproj
    

    这个命令会自动查找当前目录或指定文件,分析依赖并下载包。下载的包通常放在用户目录下的 .nuget/packages 文件夹里。

  • 如果你的项目确实还在用 packages.config

    dotnet restore 通常也能处理这种情况。只要 packages.config 文件和对应的 .csproj 文件在同一个目录下,直接在项目目录运行 dotnet restore 就行。它会读取 packages.config,并将包下载到项目目录下的 packages 文件夹(这是 packages.config 的默认行为)。

    # 切换到包含 .csproj 和 packages.config 的目录
    cd /path/to/your/project_directory
    
    # 执行恢复命令
    dotnet restore
    

3. 安全小贴士

  • 管理包源: 项目可能依赖私有 NuGet 源。你需要配置 NuGet.config 文件来添加这些源。这个文件可以放在项目、解决方案目录,或者用户配置目录 (~/.nuget/NuGet/~/.config/NuGet/)。确保只从你信任的源下载包。可以用 dotnet nuget list source 查看当前配置的源,dotnet nuget add source <URL> 添加源。

4. 进阶玩法

  • 指定包源恢复: 如果想临时用某个特定源恢复包,或者跳过某些源:
    dotnet restore --source https://api.nuget.org/v3/index.json --source https://your.private.source/nuget
    
  • 强制恢复: 忽略之前缓存的包,强制重新下载所有包(除了 HTTP 缓存):
    dotnet restore --force
    
  • 忽略失败的源: 如果某个配置的源暂时访问不了,又不想让整个恢复过程失败:
    dotnet restore --ignore-failed-sources
    
  • 控制输出详细程度: 查看更详细的恢复日志:
    dotnet restore -v detailed # 或者用 n[ormal], m[inimal], q[uiet]
    

.NET CLI 功能很全,推荐多查查官方文档,你会发现更多好用的选项。

方案二:Mono + nuget.exe (特定场景/旧项目)

如果你的项目非常老旧,或者有特殊原因必须使用 nuget.exe 本身,并且你不想(或不能)迁移到基于 SDK 的项目格式,那可以考虑用 Mono 来运行 nuget.exe

1. 原理是啥?

Mono 是一个开源项目,它实现了 .NET Framework 的大部分功能,让 .NET 程序能跑在 Linux 和 macOS 上。nuget.exe 是个 .NET Framework 程序,所以,理论上 Mono 可以运行它。你需要先安装 Mono 环境,然后下载 nuget.exe,最后通过 mono 命令来启动 nuget.exe

提醒: 这条路子相对麻烦,而且不是主流推荐。只建议在确实没法用 dotnet restore 的时候考虑。

2. 怎么操作?

  • 第一步:安装 Mono

    不同 Linux 发行版的安装方式不一样。以基于 Debian/Ubuntu 的系统为例:

    sudo apt update
    sudo apt install mono-complete # 安装完整的 Mono 开发环境
    

    对于其他发行版(如 Fedora, CentOS),请查阅 Mono 官网的安装指南。装好后验证一下:

    mono --version
    
  • 第二步:下载 nuget.exe

    去 NuGet 官网的下载页面 (https://www.nuget.org/downloads) 找到 nuget.exe 的下载链接。推荐下载最新稳定版。可以用 wgetcurl 下载:

    # 确保从官方渠道下载
    wget https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -O nuget.exe
    

    建议把 nuget.exe 放在一个方便访问的地方,比如用户目录下的某个文件夹,或者项目的某个固定位置。

  • 第三步:使用 Mono 运行 nuget.exe

    现在,你可以用 mono 命令来执行 nuget.exe 了。要还原 packages.config 文件,命令格式是:

    # mono /path/to/your/nuget.exe install /path/to/your/packages.config [options]
    

    假设你把 nuget.exe 下载到了 /home/user/tools/nuget.exe,你的 packages.config 文件在 /home/user/myproject/packages.config

    # 切换到项目目录或者任意目录,只要路径指定对
    cd /home/user/myproject
    
    # 执行安装命令
    mono /home/user/tools/nuget.exe install packages.config
    

    这个命令会读取 packages.config,然后把包下载到执行目录下的 packages 文件夹(这是 nuget.exe install 的默认行为)。

3. 安全小贴士

  • 下载来源: 一定要从 NuGet 官方网站下载 nuget.exe,避免下载到被篡改的版本。
  • Mono 兼容性: nuget.exe 的某些高级功能可能在 Mono 环境下表现不佳或不支持。遇到问题需要具体分析。
  • 环境冲突: 如果你同时在系统里装了 .NET SDK 和 Mono,注意区分使用的工具和环境,避免潜在冲突。

4. 进阶玩法

  • 创建别名: 如果经常用,可以在你的 shell 配置文件(如 .bashrc, .zshrc)里给 mono /path/to/nuget.exe 创建一个别名,比如叫 nuget-mono
    echo 'alias nuget-mono="mono /path/to/your/nuget.exe"' >> ~/.bashrc && source ~/.bashrc
    # 之后就可以直接用 nuget-mono install ...
    
  • 指定输出目录: 默认包会下载到 packages 目录。可以用 -OutputDirectory 指定:
    mono /path/to/nuget.exe install packages.config -OutputDirectory ../MyPackages
    
  • 管理包源: nuget.exe 也支持配置包源,命令类似:
    # 查看源
    mono /path/to/nuget.exe sources list
    # 添加源
    mono /path/to/nuget.exe sources add -name "MyPrivateSource" -source "https://your.private.source/nuget"
    

四、 选哪个?

  • 对于所有使用 .NET Core / .NET 5+ SDK 的项目,强烈推荐使用方案一 (dotnet restore) 。它是官方标准,跨平台性最好,与现代 .NET 生态系统无缝集成。
  • 只有当你维护非常老的 .NET Framework 项目,且无法迁移到 SDK 风格的项目文件,或者有其他特殊需求必须用 nuget.exe 才能完成的操作时,才考虑方案二 (Mono + nuget.exe) 。记得评估它的额外配置和潜在的兼容性问题。

现在,你应该清楚在 Linux 命令行环境下,怎么跟 NuGet 包打交道了。根据你的项目情况,选择合适的方案开干吧!