如何将NuGet包推送至网站子目录实现团队共享引用
问题原因
你收到推送成功的响应,不代表包已经被正确存储。dotnet nuget push是按照NuGet官方协议向目标地址发送PUT上传请求,普通的网站静态子目录没有实现NuGet服务端的包接收、持久化存储、索引生成逻辑,哪怕站点开启了PUT写入权限返回200状态码,也不会自动将上传的nupkg文件整理为NuGet客户端可识别的源结构,后续自然无法检索、安装包。
可行方案
根据团队规模和使用习惯,二选一即可:
方案1:零依赖静态NuGet源(适合小团队、包更新频率低的场景)
不需要在服务器跑任何后台服务,仅靠静态文件托管就能实现共享,步骤如下:
- 在本地电脑新建一个空文件夹作为静态源的本地工作目录,比如
D:\TeamNuGetRepo - 将所有要共享的nupkg包文件统一放到一个临时存放目录,比如
D:\RawPackages - 下载NuGet.exe命令行工具,执行以下命令生成符合NuGet v3规范的静态源结构:
nuget init D:\RawPackages D:\TeamNuGetRepo - 命令执行完成后,
D:\TeamNuGetRepo目录下会自动生成源入口文件index.json,以及按包名、版本分类的包存储结构 - 将
D:\TeamNuGetRepo下的所有文件全部上传到你网站的/nuget子目录,确保可以通过https://www.example.com/nuget/index.json直接访问到索引文件 - 团队成员在Visual Studio的NuGet包管理器中添加源,地址填
https://www.example.com/nuget/index.json即可正常检索、安装包
注意:该方案不支持直接通过dotnet nuget push在线推包,每次更新包时需要在本地重新生成源结构,再增量/全量上传到服务器即可。
方案2:轻量NuGet服务端(支持在线push,适合更新频繁的团队)
如果需要保留直接推送包到服务器的使用习惯,需要在网站对应子目录部署实现NuGet协议的轻量服务端,步骤如下:
- 新建一个空的ASP.NET项目(.NET Framework、.NET Core/.NET 5+均支持),通过NuGet安装
NuGet.Server包 - 打开配置文件:
- .NET Framework项目修改
web.config,设置packagesPath为服务器上存储包文件的物理路径,同时配置推送用的ApiKey,避免匿名用户随意上传包 - .NET Core/.NET 5+项目修改
appsettings.json完成上述相同配置
- .NET Framework项目修改
- 将项目发布到服务器,绑定到网站的
/nuget子目录对应的IIS应用程序,给应用池配置的账号授予packagesPath对应目录的读写权限 - 部署完成后先验证:浏览器访问
https://www.example.com/nuget/index.json能返回正常JSON内容即代表服务启动成功 - 后续推送包时加上ApiKey参数即可:
dotnet nuget push C:\Users\User1\source\repos\ProjectFolder\bin\Debug\LibraryName.1.0.0.nupkg -s https://www.example.com/nuget -k 你配置的ApiKey - 服务端会自动完成包存储、索引更新,团队成员同样将
https://www.example.com/nuget/index.json添加为包源即可正常使用
常见注意事项
- 不管使用哪种方案,IIS需要给
.nupkg后缀配置正确的MIME类型,对应值为application/zip,否则会出现包下载404的问题 - 添加包源时不要只填写站点根目录,要确保地址可以直接访问到
index.json入口文件,否则NuGet客户端无法识别源格式 - 静态源上传时不要遗漏自动生成的索引文件,仅上传nupkg文件会导致客户端无法扫描到任何包
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

