在项目开发中,有时我们需要封装一个类库来供其他的项目或服务使用,在正式发布类库的nuget包之前,一般我们会在本地写个Demo或者本组的其他服务需要使用这个类库,这时在本地搭建一个nuget package源,并将新的nuget包上传上去,如此一来在本地进行调试和修改类库代码就方便的多。接下来我们看下如果在本地生成nuget包,如何将其添加到本地搭建的nuget包源,以及如何使用本地nuget包。
本地生成nuget包
创建一个最简单的.Net类库项目,然后进入项目所在文件目录运行dotnet pack命令生成nuget包。
1 2 3 4 5 6 7
| D:\CodeLab\LocalNugetPackage\NugetPackageSource>dotnet pack MSBuild version 17.6.1+8ffc3fe3d for .NET 正在确定要还原的项目… 所有项目均是最新的,无法还原。 NugetPackageSource -> D:\CodeLab\LocalNugetPackage\NugetPackageSource\NugetPackageSource\bin\Debug\net7.0\NugetPackageSource.dll 包 NugetPackageSource.1.0.0 缺少自述文件。转到 https://aka.ms/nuget/authoring-best-practices/readme 了解为什么包阅读主题很重要。 已成功创建包“D:\CodeLab\LocalNugetPackage\NugetPackageSource\NugetPackageSource\bin\Debug\NugetPackageSource.1.0.0.nupkg”。
|
这时我们发现NugetPackageSource.1.0.0.nupkg包已经生成了,如果解决方案里包括多个项目,也可以指定打包参数 dotnet pack NugetPackageSource/NugetPackageSource.csproj
。
另外注意到有一句话包 NugetPackageSource.1.0.0 缺少自述文件。转到 https://aka.ms/nuget/authoring-best-practices/readme 了解为什么包阅读主题很重要。
, 于是根据链接提示在项目文件中增加如下readme文件配
置(markdown文件readme.md内容不能为空,不然会报错自述文件“readme.md”为空
)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <TargetFramework>net7.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <PackageReadmeFile>readme.md</PackageReadmeFile> <!-- 新增配置 --> </PropertyGroup> <ItemGroup> <None Include="readme.md" Pack="true" PackagePath="\"/> <!-- 新增配置 --> </ItemGroup>
</Project>
|
再次运行dotnet pack命令就不会有缺少自述文件的提示了。
1 2 3 4 5 6
| D:\CodeLab\LocalNugetPackage\NugetPackageSource>dotnet pack NugetPackageSource/NugetPackageSource.csproj MSBuild version 17.6.1+8ffc3fe3d for .NET 正在确定要还原的项目… 所有项目均是最新的,无法还原。 NugetPackageSource -> D:\CodeLab\LocalNugetPackage\NugetPackageSource\NugetPackageSource\bin\Debug\net7.0\NugetPackageSource.dll 已成功创建包“D:\CodeLab\LocalNugetPackage\NugetPackageSource\NugetPackageSource\bin\Debug\NugetPackageSource.1.0.0.nupkg”。
|
看到默认生成的nuget包版本号是1.0.0,如果指定nuget包的版本号,可以增加参数-p:PackageVersion=<版本号>。
1 2 3 4 5 6
| D:\CodeLab\LocalNugetPackage\NugetPackageSource>dotnet pack -p:PackageVersion=2.0.1 MSBuild version 17.6.1+8ffc3fe3d for .NET 正在确定要还原的项目… 已还原 D:\CodeLab\LocalNugetPackage\NugetPackageSource\NugetPackageSource\NugetPackageSource.csproj (用时 785 ms)。 NugetPackageSource -> D:\CodeLab\LocalNugetPackage\NugetPackageSource\NugetPackageSource\bin\Debug\net7.0\NugetPackageSource.dll 已成功创建包“D:\CodeLab\LocalNugetPackage\NugetPackageSource\NugetPackageSource\bin\Debug\NugetPackageSource.2.0.1.nupkg”。
|
此外还可以定义命令行环境变量, 执行set version=<版本号>后,在运行dotnet pack也可以指定nuget包版本号,更多参数可以参考。
1 2 3 4 5 6 7 8
| D:\CodeLab\LocalNugetPackage\NugetPackageSource>set version=3.0.1
D:\CodeLab\LocalNugetPackage\NugetPackageSource>dotnet pack MSBuild version 17.6.1+8ffc3fe3d for .NET 正在确定要还原的项目… 已还原 D:\CodeLab\LocalNugetPackage\NugetPackageSource\NugetPackageSource\NugetPackageSource.csproj (用时 161 ms)。 NugetPackageSource -> D:\CodeLab\LocalNugetPackage\NugetPackageSource\NugetPackageSource\bin\Debug\net7.0\NugetPackageSource.dll 已成功创建包“D:\CodeLab\LocalNugetPackage\NugetPackageSource\NugetPackageSource\bin\Debug\NugetPackageSource.3.0.1.nupkg”。
|
搭建本地nuget包源及添加包
nuget包已经打包好了,接下来我们看下如何搭建本地nuget包源。
- 在本地新建一个文件夹,名字没有特别要求,比如:LocalPackages,然后将该文件夹设置成共享文件夹后,就可以通过路径
\\localhost\LocalPackages
访问到了;
- 我们还需要一个nuget.exe工具,可以直接到这里
https://www.nuget.org/downloads
下载,版本没有特别要求,一般下载最新的版本,nuget.exe下载后无需安装,直接在命令行运行;
- 执行命令
nuget.exe add <nuget package path> -source \\localhost\LocalPackages
就可以成功的将nuget包添加到本地源了。
1 2 3
| D:\CodeLab\LocalNugetPackage\NugetPackageSource>D:\Tools\nuget.exe add "D:\CodeLab\LocalNugetPackage\NugetPackageSource\NugetPackageSource\bin\Debug\NugetPackageSource.3.0.1.nupkg" -source \\localhost\LocalPackages Installed NugetPackageSource 3.0.1 from with content hash Tr3vBM56eUIKMyf3Y8UvvS2INGiMMIU2CXshfAZELdKsm12yOTCQRIo7KiqYJoDhnPCICSRGrgtgmmE1Mf1G5Q==. Successfully added package 'D:\CodeLab\LocalNugetPackage\NugetPackageSource\NugetPackageSource\bin\Debug\NugetPackageSource.3.0.1.nupkg' to feed '\\localhost\LocalPackages'.
|
- Nuget本地源如图

使用本地nuget源的包
打开IDE后新建一个项目,默认nuget包源并没有上面我们搭建的本地源 
这是因为默认的%appdata%\NuGet\NuGet.Config
配置里没有本地的nuget源配置:
1 2 3 4 5 6
| <?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /> </packageSources> </configuration>
|
我们可以通过nuget.exe来管理nuget包源,先通过nuget.exe sources list
命令可以看到当前已经注册的nuget包源
1 2 3 4 5 6
| D:\Tools>nuget.exe sources list 注册的源: 1. nuget.org [已启用] https://api.nuget.org/v3/index.json 2. Microsoft Visual Studio Offline Packages [已启用] C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\
|
现在通过命令来注册本地包源 nuget.exe sources add -Name "localFeeds" -Source \\localhost\LocalPackages
(名称可以根据需要指定),然后再次查看包源列表发现本地包源已经注册了。
1 2 3 4 5 6 7 8
| D:\Tools>nuget.exe sources list 注册的源: 1. nuget.org [已启用] https://api.nuget.org/v3/index.json 2. localFeeds [已启用] \\localhost\LocalPackages 3. Microsoft Visual Studio Offline Packages [已启用] C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\
|
在IDE里也可以看到localFeeds了,并且之前添加的本地nuget包也可以查找到 
结语
如果本地打出来的nuget包版本包括其他信息,比如1.0.1-debug.nupkg, 1.0.1-test.nupkg等,在引用nuget包时候记得勾选上prerelease的选项。
源码
Demo代码已上传 https://github.com/jeremyLJ/local_nuget_package