推荐直接上BaGet,它基于.NET 6+、无IIS依赖、开箱即用;NuGet.Server需IIS部署且易因权限或路由报404/500,新手常卡在启动环节。

私有源用 BaGet 还是 NuGet.Server?选错就卡在启动环节
推荐直接上 BaGet,它基于 .NET 6+,单文件、无 IIS 依赖、开箱即用;NuGet.Server 是 ASP.NET Web Forms 旧架构,需 IIS 部署、配置 web.config、常因权限或路由报 404/500,新手极易卡在“页面打不开”。
实操建议:
- 去 BaGet GitHub Releases 下载最新
BaGet.dll(如BaGet.2.4.3.zip) - 解压后,在目录内打开命令行,执行:
dotnet BaGet.dll - 默认监听
http://localhost:5000,浏览器访问能看见 “BaGet v2 Feed” 即成功 - 若端口被占,加参数:
dotnet BaGet.dll --urls http://localhost:5001
注意:BaGet 默认不启用身份验证,生产环境必须加 --api-key 启动,并在推送时带 -k 参数,否则任何人均可删包。
dotnet pack 打包后推不到私有源?检查这三处硬性要求
本地打包成功 ≠ 能推到私有源。常见失败不是网络问题,而是包本身不合规。
必须确认:
-
.csproj中已显式声明<PackageId>MyLib</PackageId>和<Version>1.0.0</Version>—— 没设就生成Unnamed.1.0.0.nupkg,BaGet 拒收 - 运行的是
dotnet pack --configuration Release,Debug 模式打包的版本号含-dev后缀,部分私有源校验严格会拒绝 - 推送命令中
-Source的 URL 必须带v3或v2路径:BaGet 是http://localhost:5000/v3/index.json;NuGet.Server 是http://localhost:5000/nuget(结尾无斜杠)
正确推送示例:dotnet nuget push bin/Release/MyLib.1.0.0.nupkg -s http://localhost:5000/v3/index.json -k my-api-key
Visual Studio 怎么识别并使用私有源?别只填 URL
填了源地址却搜不到包?多半是没启用或没刷新缓存。
操作要点:
- 在 VS 中打开「工具 → 选项 → NuGet 包管理器 → 包源」,点击 “+” 添加新源
- 名称随意(如
LocalBaGet),但源位置必须完整且可访问:http://localhost:5000/v3/index.json - 勾选该源左侧的复选框 —— 不勾选 = 无视此源
- 点「更新」按钮(不是确定),强制刷新源索引;首次添加后建议重启 VS,避免缓存残留
- 在项目「管理 NuGet 包」界面,右上角下拉菜单切换到你的私有源,再搜索包名
如果仍显示 “无可用包”,用浏览器直连 http://localhost:5000/v3/index.json,看是否返回 JSON 格式的 service index;返回 HTML 或 404 说明 BaGet 没跑对路径。
私有源里删错包怎么办?nuget.exe delete 不是万能的
BaGet 默认不支持删除(出于安全设计),nuget.exe delete 对它无效;而 NuGet.Server 虽支持,但需手动开启 enableDelisting 并配密钥,稍有不慎就 401。
更稳妥的做法:
- 开发阶段:直接删掉
BaGet数据目录(默认是./storage)并重启服务,相当于重置 - 测试阶段:用不同
PackageId(如加-alpha后缀)代替覆盖,避免版本冲突 - 生产环境:严禁开放删除接口;包发错就升版,靠语义化版本号区分(
1.0.0→1.0.1-fix)
真正容易被忽略的是:私有源一旦被多个团队共用,PackageId 命名必须全局唯一且带组织前缀(如 Contoso.Logging),否则 A 团队推的包可能被 B 团队同名包覆盖或干扰 —— 这个约束不会报错,但后果严重。


















