如何:NuGet 本地源

发布: (2026年1月11日 GMT+8 05:49)
9 min read
原文: Dev.to

Source: Dev.to

如何使用本地 NuGet 源

在这篇文章中,我将向你展示如何在本地机器上创建并使用 NuGet 包源。这在以下几种情况下非常有用:

  • 你想在没有网络连接的环境中共享内部库
  • 你想在 CI/CD 流水线中使用自定义包,而不想将它们推送到公共源
  • 你想快速测试一个本地构建的包,而不必先发布到远程服务器

下面的步骤适用于 .NET Core / .NET 5+ 项目,并且在 Windows、macOS 和 Linux 上都能工作。


步骤 1:创建本地文件夹

首先,创建一个用于存放 .nupkg 文件的文件夹。例如:

C:\LocalNuGetFeed
# 或者在 macOS / Linux 上
~/local-nuget-feed

将你想要使用的所有 NuGet 包(.nupkg 文件)复制到该文件夹中。


步骤 2:在 NuGet.config 中添加本地源

你可以在以下位置之一创建或编辑 NuGet.config

  • 项目根目录(对单个项目生效)
  • 解决方案根目录(对整个解决方案生效)
  • 用户主目录(对当前用户的所有项目生效)

下面的示例展示了如何在项目根目录下创建 NuGet.config 并添加本地源:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="LocalFeed" value="C:\LocalNuGetFeed" />
    <!-- 你可以保留默认的 nuget.org 源 -->
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
  </packageSources>
</configuration>

提示:在 macOS / Linux 上,value 应该使用对应的路径,例如 ~/local-nuget-feed


步骤 3:使用 dotnet CLI 添加源(可选)

如果你更喜欢使用命令行而不是手动编辑 NuGet.config,可以运行:

dotnet nuget add source "C:\LocalNuGetFeed" --name LocalFeed

在 macOS / Linux 上:

dotnet nuget add source "$HOME/local-nuget-feed" --name LocalFeed

此命令会自动在全局(用户级)NuGet.config 中添加源。


步骤 4:在项目中引用本地包

一旦本地源已配置,你可以像引用任何其他 NuGet 包一样引用它。例如,假设你有一个名为 MyCompany.Logging 的包,版本为 1.2.3

dotnet add package MyCompany.Logging --version 1.2.3

如果你使用的是 Visual Studio,只需打开 NuGet 包管理器,在 浏览 选项卡中选择 LocalFeed,然后搜索并安装所需的包。


步骤 5:在 CI/CD 中使用本地源(进阶)

在 CI 环境中,你可能不想在每次构建时都手动复制 .nupkg 文件。下面是一种常见的做法:

  1. 在构建脚本的开头,将生成的包复制到共享的工作区目录(例如 $(Build.ArtifactStagingDirectory)/nuget-feed)。
  2. 使用 dotnet nuget add source 将该目录添加为临时源。
  3. 运行 dotnet restoredotnet build,让项目从该本地源恢复依赖。

示例(Azure Pipelines):

- script: |
    mkdir $(Build.ArtifactStagingDirectory)/nuget-feed
    cp $(Build.SourcesDirectory)/**/*.nupkg $(Build.ArtifactStagingDirectory)/nuget-feed
    dotnet nuget add source "$(Build.ArtifactStagingDirectory)/nuget-feed" --name BuildLocalFeed
  displayName: 'Setup local NuGet feed'

常见问题

问题解决方案
找不到包确认 NuGet.config 中的路径是绝对路径且指向正确的文件夹。检查文件夹中是否真的存在对应的 .nupkg
包版本冲突使用 dotnet add package 时显式指定版本,或在 PackageReference 中锁定版本。
在 CI 中路径不一致使用环境变量(如 $(Build.ArtifactStagingDirectory))来构建跨平台的路径。
想让本地源在所有机器上可用NuGet.config 放在用户主目录下,或在组织内部共享一个统一的配置文件。

小结

  • 创建本地文件夹并放入 .nupkg
  • NuGet.config 或使用 dotnet nuget add source 注册该文件夹为源
  • 正常使用 dotnet add package 或 Visual Studio 引用包
  • 在 CI/CD 中通过脚本动态添加本地源,实现完全离线的包管理

使用本地 NuGet 源可以让你在没有网络或不想公开内部库的情况下,仍然保持对依赖的完整控制。祝你玩得开心!

Source:

介绍

NuGet 包 是 .NET 开发者共享、版本化和使用 可复用代码的标准方式——无论是核心库、第三方工具,还是内部公司组件。NuGet 包本质上是一个压缩包,包含已编译的程序集、元数据和依赖信息,这使得 Visual Studio 和 .NET CLI 能够自动还原项目所需的正确版本。

该系统已经存在多年,并且之所以有效,是因为它强制一致性:你不再需要手动复制 DLL;相反,你声明所依赖的内容,让 NuGet 在可预测且可重复的方式下管理更新、冲突和构建。

在本文中,学习如何编写代码将包发布到本地源

NuGet.org 上的个人账户

您必须创建一个个人账户以在 NuGet.org 上发布和管理包。

本地 feed / source

NuGet 本地 feed 只是您机器或网络上的一个文件夹,NuGet 将其视为包源,允许您创建、存储和使用 NuGet 包,而无需将它们发布到像 nuget.org 这样的远程仓库。

本地 feed 速度快、支持离线使用,非常适合内部或实验性的包;但它缺乏正式包服务器提供的治理、版本管理纪律和可审计性。

何时创建本地包

  • 开发者反复使用相同的代码。
  • 代码是开发者或组织的专有资产。
  • 易于维护,并且可以提供多个版本。

入门示例 1

开发者或团队需要为 Dapper 创建一个类型处理器,以便能够识别 DateOnlyTimeOnly 结构体。这可以是本地包或公共包(请参阅公共版本此处)。

public class SqlDateOnlyTypeHandler : SqlMapper.TypeHandler
{
    public override void SetValue(IDbDataParameter parameter, DateOnly date)
        => parameter.Value = date.ToDateTime(new TimeOnly(0, 0));

    public override DateOnly Parse(object value) => DateOnly.FromDateTime((DateTime)value);
}

public class SqlTimeOnlyTypeHandler : SqlMapper.TypeHandler
{
    public override void SetValue(IDbDataParameter parameter, TimeOnly time)
    {
        parameter.Value = time.ToString();
    }

    public override TimeOnly Parse(object value) => TimeOnly.FromTimeSpan((TimeSpan)value);
}

入门示例 2

开发者或团队开发了一个专有 API,仅在内部 使用。这些包需要受到保护;否则,黑客可以轻易获取源代码。包文件和 .dll 文件一样容易被破解。

将包发布到本地 Feed / Source – 工具

  • 源代码:

截图

The tool

使用工具

  1. 选择 package
  2. 选择 packageversion
  3. 点击 Publish 按钮。
    • 会出现确认对话框;点击 Yes 继续。
    • 如果该 package 已存在,将被覆盖。

配置

要配置此工具,请打开 appsettings.json

PackageLocation

指向存放 Microsoft Visual Studio 本地 NuGet 包的文件夹。

Visual Studio 的 NuGet 包源选项对话框

Visual Studio 的 NuGet 包源选项对话框

ProjectItems 部分

添加一个或多个指向包含一个或多个 .nupkg 文件的 项目文件夹 的路径。

  • 该路径指向 项目文件夹而不是 直接指向 .nupkg 文件。
  • 路径可以属于一个或多个 Visual Studio 解决方案。

示例 appsettings.json(五个路径)

{
  "PackageLocation": "C:\\NuGetLocal",
  "ProjectItems": [
    { "Path": "C:\\DotnetLand\\VS2022\\ProjectTemplates2025\\SpectreConsoleLibrary" },
    { "Path": "C:\\DotnetLand\\VS2022\\BogusTrainingSolution\\BogusLibrary" },
    { "Path": "C:\\DotnetLand\\VS2022\\SerilogSolution\\SeriLogThemesLibrary" },
    { "Path": "C:\\DotnetLand\\VS2022\\ConsoleHelpersSolution\\ConsoleConfigurationLibrary" },
    { "Path": "c:\\DotnetLand\\VS2019\\dapper-libraries\\Dapper.Handlers" }
  ]
}

重要

💡 方法 DirectoryHelper.ProjectItems 会遍历 appsettings.jsonProjectItems 指定的文件夹。只有 存在 且包含 .nupkg 文件的路径才会被处理。

工具中至少会显示一个 .nupkg

摘要

本篇文章提供了使用本地 NuGet 包的说明以及开发者或开发团队为何可能想要使用本地 NuGet 包的原因,并介绍了一种将包复制到本地 Feed 文件夹的工具,以帮助使用本地 NuGet 包。

Back to Blog

相关文章

阅读更多 »

在 C# 中将 RTF 转换为 PDF

概述 RTF(Rich Text Format)是一种跨平台的格式,广泛用于文档编辑和数据交换。相比之下,PDF 则是文档分发的理想选择……

NuGet 中的 WebForms Core

概述:WebForms Core 是由 Elanat 开发的服务器驱动 UI 技术,现已在 NuGet 上正式提供,包名为 WFC。该包允许…