You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将nuget.config中的packageSource设为可选,实现零配置还原?

零配置解决方案:让dotnet restore自动跳过不可达源

嘿,刚好我之前也碰到过和你一模一样的居家办公NuGet源问题,完全理解你想要零配置、能直接签入源码管理的诉求,给你分享几个靠谱的方案:

首选方案:启用skipInvalidSources配置(NuGet 5.10+/NET 6+)

从NuGet 5.10版本(对应.NET 6及以上的SDK)开始,官方新增了skipInvalidSources这个配置项,它能让dotnet restore自动跳过那些无法访问的源,而不是直接抛出失败错误。这个配置可以直接写在你的nuget.config里,签入源码管理后,不管在公司还是居家都不用手动改文件,完美符合你的零配置要求。

具体配置方式如下,直接修改你的nuget.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <config>
    <!-- 关键配置:跳过不可访问的源,避免restore失败 -->
    <add key="skipInvalidSources" value="true" />
  </config>
  <packageSources>
    <add key="CompanyLocalSource" value="\\company-network\shared\nuget-packages" />
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
  </packageSources>
</configuration>

这里要注意一个细节:如果你的自定义NuGet包只存在于公司本地源,那居家时跳过这个源后还是会找不到包。这时候可以再加一个本地离线源,把需要的包提前下载到本地文件夹,然后把这个源也加到nuget.config里:

<packageSources>
  <add key="CompanyLocalSource" value="\\company-network\shared\nuget-packages" />
  <add key="LocalOfflinePackages" value=".\local-nuget-packages" />
  <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
</packageSources>

然后把local-nuget-packages文件夹加入.gitignore(避免签入源码管理),居家时只要把需要的包放到这个文件夹里,dotnet restore就会自动找到它们;在公司时则会优先使用网络源,完全不用切换配置。

兼容旧SDK的备选方案(.NET 5及以下)

如果你的项目还在使用较旧的.NET SDK(不支持skipInvalidSources),那还有个零配置的小技巧:利用NuGet的本地缓存。

  • 在公司上班时,先正常执行一次dotnet restore,NuGet会把所有需要的包缓存到本地默认路径(Windows是%userprofile%\.nuget\packages,Mac/Linux是~/.nuget/packages)。
  • 居家办公时,即使公司源不可达,dotnet restore会先检查本地缓存,如果缓存里有需要的包,就不会再去尝试访问不可达的源,也就不会失败。

不过这个方案有个局限性:如果项目新增了未缓存的包或者需要更新包版本,居家时还是会失败,所以更推荐升级SDK用第一种方案。

内容的提问来源于stack exchange,提问作者Stephen Angell

火山引擎 最新活动