如何:NuGet 本地源
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 文件。下面是一种常见的做法:
- 在构建脚本的开头,将生成的包复制到共享的工作区目录(例如
$(Build.ArtifactStagingDirectory)/nuget-feed)。 - 使用
dotnet nuget add source将该目录添加为临时源。 - 运行
dotnet restore或dotnet 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 创建一个类型处理器,以便能够识别 DateOnly 和 TimeOnly 结构体。这可以是本地包或公共包(请参阅公共版本此处)。
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 – 工具
- 源代码:
截图
使用工具
- 选择 package。
- 选择 package 的 version。
- 点击 Publish 按钮。
- 会出现确认对话框;点击 Yes 继续。
- 如果该 package 已存在,将被覆盖。
配置
要配置此工具,请打开 appsettings.json。
PackageLocation
指向存放 Microsoft 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.json 中 ProjectItems 指定的文件夹。只有 存在 且包含 .nupkg 文件的路径才会被处理。
工具中至少会显示一个 .nupkg。
摘要
本篇文章提供了使用本地 NuGet 包的说明以及开发者或开发团队为何可能想要使用本地 NuGet 包的原因,并介绍了一种将包复制到本地 Feed 文件夹的工具,以帮助使用本地 NuGet 包。
