✅ 1. 什么是包源映射?
包源映射用于 限制某些包只能从指定源下载,避免包从错误来源被拉取(尤其企业内部私有源)。
它是配置在:
(A) 全局 NuGet.Config(推荐)
XML
%AppData%\NuGet\NuGet.Config
(B) 解决方案目录下 /NuGet.Config(也可)
结构如下:
XML
<configuration>
<packageSources>...</packageSources>
<packageSourceMapping>...</packageSourceMapping>
</configuration>
🟦 示例 1:企业私有源 + 官方源
需求:
-
你希望所有 公司内部包(如 Company.*)只能从内部源拉取
-
其他则从 nuget.org
📌 配置:
XML
<configuration>
<packageSources>
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
<add key="internal" value="https://nuget.mycompany.com/v3/index.json" />
</packageSources>
<packageSourceMapping>
<packageSource key="internal">
<package pattern="Company.*" />
<package pattern="InternalLib.*" />
</packageSource>
<packageSource key="nuget.org">
<package pattern="*" />
</packageSource>
</packageSourceMapping>
</configuration>
✔ 效果:
| 包名 | 下载源 |
|---|---|
| Company.Core | internal |
| InternalLib.Math | internal |
| Newtonsoft.Json | nuget.org |
| AutoMapper | nuget.org |
🟧 示例 2:从多个专门源拉取不同包
需求:
-
EntityFramework 相关包从 EF 官方源
-
DevExpress 包从 DevExpress 源
-
剩余从 nuget.org
📌 配置:
XML
<packageSources>
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
<add key="ef" value="https://www.nuget.org/api/v2/curated-feeds/microsoftdotnet/" />
<add key="devexpress" value="https://nuget.devexpress.com/api" />
</packageSources>
<packageSourceMapping>
<packageSource key="ef">
<package pattern="Microsoft.EntityFrameworkCore.*" />
<package pattern="EntityFramework.*" />
</packageSource>
<packageSource key="devexpress">
<package pattern="DevExpress.*" />
</packageSource>
<packageSource key="nuget.org">
<package pattern="*" />
</packageSource>
</packageSourceMapping>
🟨 示例 3:指定只有某个包可以从私有源
需求:
你的项目依赖一个私有包:
-
只能从内部源 InternalFeed
-
其他包都从 nuget.org
📌 配置:
XML
<packageSources>
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
<add key="InternalFeed" value="https://myfeed.company.com/v3/index.json" />
</packageSources>
<packageSourceMapping>
<packageSource key="InternalFeed">
<package pattern="MyCompany.SecretPackage" />
</packageSource>
<packageSource key="nuget.org">
<package pattern="*" />
</packageSource>
</packageSourceMapping>
🟥 示例 4:完全阻止某个源的包被使用
需求:
公司强制所有包必须从 私有镜像 下载,不允许连外网 nuget.org。
📌 配置:
XML
<packageSources>
<add key="mirror" value="https://mirror.company.com/nuget/v3/index.json" />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
</packageSources>
<packageSourceMapping>
<packageSource key="mirror">
<package pattern="*" />
</packageSource>
<packageSource key="nuget.org">
<!-- 不配置任何 pattern = 禁止使用 -->
</packageSource>
</packageSourceMapping>
✔ 效果:你即使手动点"恢复",VS 也不会从 nuget.org 下载任何包。
🟩 示例 5:需要多个源,但要优先内部源
需求:
-
如果包在内部源存在 → 必须从内部源
-
外部源补充即可
❗NuGet 本身不支持"优先级",但可以用 同名匹配 强制内部源优先:
📌 配置:
XML
<packageSourceMapping>
<packageSource key="internal">
<package pattern="*" />
</packageSource>
<packageSource key="nuget.org">
<package pattern="*" />
</packageSource>
</packageSourceMapping>
✔ NuGet 会尝试内部源 → 如果找不到 → 再尝试 nuget.org
补充1:关闭包源映射
XML
<packageSourceMapping>
<clear />
</packageSourceMapping>
📌 注意点(容易踩坑)
-
只写 packageSources 不写 packageSourceMapping → 所有源全部启用
-
如果某个源没有映射任何 pattern → 该源永远不会被使用
-
pattern 支持通配符、前缀匹配,不支持正则
-
解决方案目录下的 NuGet.Config 优先级 > 全局