NuGet CLI sources命令未更新NuGet.Config,本地包无法引用问题
咱们一步步拆解并解决你遇到的问题:
1. 为什么本地源未出现在~/.nuget/NuGet/NuGet.Config中?
nuget sources add命令默认修改的用户级配置文件路径在不同系统/环境下存在差异:
- 独立安装的NuGet CLI,在Linux/macOS下通常修改
~/.config/NuGet/NuGet.Config,Windows下则是%APPDATA%\NuGet\NuGet.Config - .NET SDK自带的
dotnet nuget工具,默认操作的是~/.nuget/NuGet/NuGet.Config(Linux/macOS)
你用nuget sources list能看到源,说明这个源被添加到了当前NuGet CLI对应的配置文件里,但不是你查看的那个~/.nuget/NuGet/NuGet.Config,所以.NET SDK的dotnet命令读取不到这个源。
2. 如何让本地源自动加入目标配置文件?
直接使用.NET SDK自带的dotnet nuget命令添加源,它会直接修改~/.nuget/NuGet/NuGet.Config:
dotnet nuget add source /full/path/to/the/packages --name My.Namespace
如果坚持要用独立NuGet CLI,也可以强制指定配置文件路径修改:
nuget sources add -Name My.Namespace -Source /full/path/to/the/packages -ConfigFile ~/.nuget/NuGet/NuGet.Config
添加完成后,执行dotnet nuget list source验证,就能看到你的本地源已经在列表里了。
3. 本地创建并依赖NuGet包的正确流程
按照以下步骤操作,就能彻底避免你遇到的问题:
步骤1:打包本地项目
确保你的类库项目的.csproj里配置了必要的打包字段(比如PackageId、Version),然后执行打包命令:
dotnet pack --configuration Debug
生成的.nupkg文件会在bin/Debug目录下。
步骤2:添加本地NuGet源
用dotnet nuget命令将本地目录设为源(务必用绝对路径):
dotnet nuget add source /full/path/to/the/packages --name My.Local.Source
步骤3:将包上传到本地源
你可以手动复制.nupkg到对应目录结构(就像你已经做的那样),也可以用dotnet nuget push自动生成规范的目录结构:
dotnet nuget push bin/Debug/My.Namespace.0.0.0.nupkg --source /full/path/to/the/packages
步骤4:在目标项目中添加包引用
务必指定版本号(因为本地源只有一个版本,避免NuGet默认去nuget.org查找):
dotnet add package My.Namespace --version 0.0.0
备选方案:仅在项目中使用本地源(不修改全局配置)
如果你不想把本地源添加到全局配置,可以在目标项目的根目录下创建一个NuGet.Config文件,内容如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /> <add key="My.Local.Source" value="/full/path/to/the/packages" /> </packageSources> </configuration>
这样dotnet add package命令会自动读取项目级配置,优先查找本地源。
补充:关于你遇到的错误
报错Unable to find package My.Namespace. No packages exist with this id in source(s): nuget.org的核心原因就是dotnet命令没有读取到你的本地源,所以只会去nuget.org查找,自然找不到你的本地包。按照上面的方法添加源后,这个问题就能直接解决。
内容的提问来源于stack exchange,提问作者user3310334

