如何仅镜像指定所有者的NuGet包?能否按所有者筛选镜像nuget.com包
当然可行!按所有者筛选来镜像NuGet包是完全可以实现的,具体做法取决于你使用的镜像工具。下面我会针对几种常用工具给出实操方案:
1. 使用BaGet(轻量开源NuGet服务器)
BaGet是目前比较受欢迎的轻量NuGet镜像工具,它原生支持按所有者筛选同步。你只需要修改配置文件即可:
打开appsettings.json,找到Mirror节点,添加OwnerFilter配置:
{ "Mirror": { "Enabled": true, "Source": "https://api.nuget.org/v3/index.json", "OwnerFilter": ["YourTargetOwnerName"], "PackageRetention": "LatestVersion" // 可选,比如只保留最新版本,节省空间 } }
保存配置后重启BaGet服务,它就只会同步指定所有者发布的包了。如果需要多个所有者,直接在数组里添加更多名称即可。
2. 使用NuGet.Server(官方基础服务器)
NuGet.Server本身没有内置的筛选同步功能,但你可以通过自定义代码来实现。核心思路是利用NuGet的官方API查询指定所有者的包,然后下载到本地仓库:
首先,创建一个控制台项目,引用NuGet.Protocol和NuGet.Common包,然后编写类似下面的代码:
using NuGet.Common; using NuGet.Protocol; using NuGet.Protocol.Core.Types; using NuGet.Versioning; var targetOwner = "YourTargetOwnerName"; var localRepoPath = @"C:\NuGetServer\Packages"; // NuGet.Server的包存储路径 var logger = NullLogger.Instance; var cache = new SourceCacheContext(); // 创建NuGet源 var repository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json"); // 获取搜索资源 var searchResource = await repository.GetResourceAsync<PackageSearchResource>(); // 搜索指定所有者的所有包 var searchFilter = new SearchFilter(includePrerelease: false); searchFilter.Owners.Add(targetOwner); var results = await searchResource.SearchAsync( "", // 空搜索表示匹配所有包 searchFilter, skip: 0, take: int.MaxValue, logger, CancellationToken.None); // 下载每个包到本地仓库 foreach (var result in results) { var packageId = result.Identity.Id; var latestVersion = result.Identity.Version; var packageDownloader = await repository.GetResourceAsync<PackageDownloaderResource>(); var downloadResult = await packageDownloader.DownloadPackageAsync( result.Identity, new PackageDownloadContext(cache), localRepoPath, logger, CancellationToken.None); Console.WriteLine($"下载完成: {packageId} {latestVersion}"); }
你可以把这段代码做成定时任务(比如Windows任务计划或Linux Cron),定期同步最新的包。
3. 使用Nexus Repository(企业级仓库管理)
如果你用的是Nexus这类企业级工具,配置起来也很简单:
- 创建一个NuGet代理仓库,指向nuget.com的官方源
- 在仓库的“Advanced”设置里,找到“Custom Query Parameters”,添加
owner=YourTargetOwnerName - 保存配置后,Nexus在代理请求时会自动带上这个筛选条件,只会返回指定所有者的包
另外,你也可以通过Nexus的任务功能,设置定期同步指定所有者的包,确保本地仓库始终是最新的。
注意事项
- 有些包可能有多个所有者,如果你想匹配“包含指定所有者”的包,大部分工具的筛选逻辑都是满足的;如果需要“仅指定所有者”的包,可能需要额外确认工具的筛选规则
- 如果需要同步预发布版本,记得在配置或代码里开启对应的选项
- 定期检查同步日志,确保没有因为API限制或网络问题导致同步失败
内容的提问来源于stack exchange,提问作者user2419860
相关产品推荐
相关产品推荐

