在项目开发中,有时我们需要封装一个类库来供其他的项目或服务使用,在正式发布类库的nuget包之前,一般我们会在本地写个Demo或者本组的其他服务需要使用这个类库,这时在本地搭建一个nuget package源,并将新的nuget包上传上去,如此一来在本地进行调试和修改类库代码就方便的多。接下来我们看下如果在本地生成nuget包,如何将其添加到本地搭建的nuget包源,以及如何使用本地nuget包。

本地生成nuget包

创建一个最简单的.Net类库项目,然后进入项目所在文件目录运行dotnet pack[1]命令生成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:1]

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包源。

  1. 在本地新建一个文件夹,名字没有特别要求,比如:LocalPackages,然后将该文件夹设置成共享文件夹后,就可以通过路径\\localhost\LocalPackages访问到了;
  2. 我们还需要一个nuget.exe工具,可以直接到这里https://www.nuget.org/downloads下载[2],版本没有特别要求,一般下载最新的版本,nuget.exe下载后无需安装,直接在命令行运行;
  3. 执行命令 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'.
  1. Nuget本地源如图Nuget Local Feeds

使用本地nuget源的包

打开IDE后新建一个项目,默认nuget包源并没有上面我们搭建的本地源 nuget package soure

这是因为默认的%appdata%\NuGet\NuGet.Config[3]配置里没有本地的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 package local source

结语

如果本地打出来的nuget包版本包括其他信息,比如1.0.1-debug.nupkg, 1.0.1-test.nupkg等,在引用nuget包时候记得勾选上prerelease的选项。

源码

Demo代码已上传 https://github.com/jeremyLJ/local_nuget_package


  1. https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-pack ↩︎ ↩︎

  2. https://learn.microsoft.com/en-us/nuget/reference/nuget-exe-cli-reference ↩︎

  3. https://learn.microsoft.com/en-us/nuget/reference/cli-reference/cli-ref-sources ↩︎