用 Verdaccio 搭建私有 NuGet 服务器最简路径
Verdaccio 是轻量、开箱即用的私有包注册中心,对 .NET 开发者来说,它比 BaGet 更容易启动且默认支持 NuGet 协议(通过
verdaccio-nuget插件或原生兼容)。但注意:Verdaccio 默认不启用 NuGet 兼容模式,必须显式配置。
实操建议:
安装 Node.js(≥16.x),然后全局安装:npm install -g verdaccio初始化配置:
verdaccio --init,生成
config.yaml编辑
config.yaml,确保包含以下关键项:
storage: ./storage
auth:
htpasswd:
file: ./htpasswd
packages:
'**':
access: $all
publish: $authenticated
unpublish: $authenticated
启动服务:verdaccio --config config.yaml,默认监听
http://localhost:4873在客户端机器上添加源:
dotnet nuget add source http://localhost:4873 --name my-private或用
nuget sources add -name my-private -source http://localhost:4873
常见错误:客户端执行
dotnet restore报
Unable to load the service index for source—— 大概率是 Verdaccio 未运行,或防火墙/反向代理拦截了
/v3/index.json路径。Verdaccio v5+ 原生响应 NuGet v3 API,无需额外插件。
BaGet 作为纯 .NET 方案的部署要点
BaGet 是 C# 编写的 NuGet 服务器,更适合已深度使用 .NET 生态的团队,但它不自带身份认证,也默认不启用符号包(
.snupkg)支持,需手动开启。
实操建议:
下载最新BaGet.Web.dll(从 GitHub Releases 获取预编译版本),或用
dotnet tool install --global baget --version 2.4.0创建空目录,放入
appsettings.json,至少配置:
{
"BaGet": {
"Storage": {
"Type": "FileSystem",
"Path": "./packages"
},
"Symbol": {
"Enabled": true
}
}
}
启动:dotnet BaGet.Web.dll(或用
baget run工具命令) 首次推送前,需设置 API key:访问
http://localhost:5000/v3/index.json后,在页面底部点击 “API Keys” 创建 key,并记下值 推送包:
dotnet nuget push MyPackage.1.0.0.nupkg -s http://localhost:5000/v3/index.json -k YOUR_API_KEY
注意:BaGet 默认监听
http://localhost:5000,若用
dotnet run本地调试,要确认
launchSettings.json中的
applicationUrl是否覆盖了端口;另外,它的
/v3/index.json返回的是标准 NuGet V3 服务索引,但不支持
search/query端点(搜索功能需自行集成或改用 Verdaccio)。
客户端如何正确配置 NuGet.config 绑定私有源
单靠
dotnet nuget add source添加的源只写入用户级
NuGet.Config,CI/CD 或多开发者协作时容易遗漏。推荐直接编辑项目根目录下的
NuGet.Config文件,确保源定义显式、可提交。
示例
NuGet.Config内容:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<sources>
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
<add key="my-private" value="http://localhost:4873" />
</sources>
<config>
<add key="http_cache" value="C:\tmp\nuget-cache" />
</config>
</configuration>
关键点:
value必须是完整 URL,不能省略协议(
http://或
https://) 若私有源启用了 Basic Auth(如 Verdaccio 配置了
htpasswd),需在
dotnet nuget add source时加
--username和
--password,或在
NuGet.Config中用
<packagesourcecredentials></packagesourcecredentials>区块明文存储(仅限开发环境) 多个源共存时,NuGet 默认按顺序查找,但不会自动合并依赖解析结果;若私有源中缺失某包,会继续查下一个源 —— 这行为不可控,建议用
dotnet restore --no-cache排查是否误命中缓存
为什么 Verdaccio 和 BaGet 都可能被 Visual Studio 识别为“不可用源”
VS 的 NuGet 包管理器 UI 对私有源的健康检查更严格:它会尝试请求
/v3/index.json并验证响应头中的
Content-Type: application/json和响应体结构。哪怕服务正常返回 JSON,只要字段缺失(如
resources数组为空或格式不符),VS 就显示“源不可用”或“无包可用”。
排查步骤:
用浏览器或curl -v http://localhost:4873/v3/index.json直接访问,确认状态码是 200,且响应体含
"resources"和
"version"字段 Verdaccio 若未加载
verdaccio-nuget插件(旧版必需),或配置中
packages['**']权限未设
access: $all,会导致
/v3/index.json返回空资源列表 BaGet 若未在
appsettings.json中启用
Symbol.Enabled,某些 VS 版本(如 17.4+)会因缺少
symbol-package-base-address资源而降级处理源 Windows 上若用 localhost + 非标准端口,部分 VS 版本会因 IE 安全区域策略拒绝连接 —— 可临时改用
127.0.0.1替代
localhost
真正麻烦的不是搭建,而是让每个开发者的 VS、dotnet CLI、CI agent 用同一套凭据和 URL 解析出一致的包列表;路径、协议、权限三者稍有错位,就会出现“能 push 但 restore 不到”这类静默失败。
