常见的 NuGet 配置
NuGet 的行为受一个或多个配置 (XML) 文件中累积设置驱动,这些文件可以存在于解决方案(如果不使用解决方案,则存在项目)、用户和计算机级别。
配置文件的位置和使用
范围 | NuGet.Config 文件位置 |
说明 |
---|---|---|
解决方案 | 当前文件夹(又称解决方案文件夹)或上至驱动器根目录的任何文件夹。 | 在解决方案文件夹中,设置应用于子文件夹中的所有项目。 请注意,如果配置文件位于项目文件夹中,则对该项目没有任何影响。 在命令行上还原项目时,项目的目录被视为解决方案目录,这可能会导致还原项目与解决方案时的行为差异。 |
用户 | Windows:%appdata%\NuGet\NuGet.Config Mac/Linux: ~/.config/NuGet/NuGet.Config 或 ~/.nuget/NuGet/NuGet.Config (因工具而异)所有平台都支持其他配置。 这些配置无法通过工具进行编辑。 Windows: %appdata%\NuGet\config\*.Config Mac/Linux: ~/.config/NuGet/config/*.config 或 ~/.nuget/config/*.config |
设置应用于所有操作,但可被任何解决方案级的设置替代。 |
计算机 | Windows:%ProgramFiles(x86)%\NuGet\Config Mac/Linux:默认为 /etc/opt/NuGet/Config (Linux) 或 /Library/Application Support (Mac)。 如果 $NUGET_COMMON_APPLICATION_DATA 既不是 null 也不是空,则为 $NUGET_COMMON_APPLICATION_DATA/NuGet/Config 。 |
设置虽然适用于计算机上的所有操作,但会被任何用户级或解决方案级设置覆盖。 |
注意
在 Mac/Linux 上,用户配置文件位置因工具而异。 .NET CLI 使用 ~/.nuget/NuGet
文件夹,而 Mono 使用 ~/.config/NuGet
文件夹。
在 Mac/Linux 上,用户级配置文件位置因工具而异
在 Mac/Linux 上,用户配置文件位置因工具而异。
大多数用户都会使用查找 ~/.nuget/NuGet
文件夹下用户配置文件的工具。
其他工具在 ~/.config/NuGet
文件夹下查找用户配置文件:
- Mono
- NuGet.exe
- Visual Studio 2019 for Mac(及更早版本)
- 仅当处理经典 Mono 项目时,使用 Visual Studio 2022 for Mac(及更高版本)。
如果使用的工具涉及这两个位置,请考虑按照以下步骤合并它们,以便仅使用一个用户级配置文件:
- 检查两个用户级配置文件的内容,并将所需的配置文件保留在
~/.nuget/NuGet
文件夹下。 - 将符号链接设置为从
~/.nuget/NuGet
到~/.config/NuGet
。 例如,运行 bash 命令:ln -s ~/.nuget/NuGet ~/.config/NuGet
。
针对早期版本的 NuGet 的说明:
- NuGet 3.3 及更早版本使用
.nuget
文件夹作为解决方案范围的设置。 NuGet 3.4+ 中不使用此文件夹。 - 对于 NuGet 2.6 到 3.x,Windows 上计算机级别配置文件以前位于
%ProgramData%\NuGet\Config[\{IDE}[\{Version}[\{SKU}]]]\NuGet.Config
({IDE}
是VisualStudio
,{Version}
是 Visual Studio 版本,例如14.0
,以及{SKU}
是Community
、Pro
或Enterprise
)。 若要将设置迁移到 NuGet 4.0+,只需将配置文件复制到%ProgramFiles(x86)%\NuGet\Config
即可。 在 Linux 上,此先前位置以前为/etc/opt
;在 Mac 上则为/Library/Application Support
。
更改配置设置
NuGet.Config
文件是包含键/值对的简单 XML 文本文件,请参阅 NuGet 配置设置主题。
设置通过 NuGet CLI config 命令进行管理:
- 默认情况下需更改用户级配置文件。 (在 Mac/Linux 上,用户级配置文件位置因工具而异)
- 若要更改其他文件中的设置,请使用
-configFile
开关。 在此情况下,文件可以使用任何文件名。 - 键始终需要区分大小写。
- 更改计算机级设置文件中的设置需要提升权限。
警告
尽管可以修改任何文本编辑器中的文件,但如果配置文件中包含格式不正确的 XML(不匹配的标记、无效引号等),NuGet(v3.4.3 及更高版本)将以无提示方式忽略整个配置文件。 因此推荐使用 nuget config
管理设置。
设置值
Windows:
# Set globalPackagesFolder in the user-level config file
dotnet nuget config set globalPackagesFolder "C:\packages"
# Set repositoryPath (available for packages.config only) in the user-level config file
dotnet nuget config set repositoryPath "C:\packages"
# Set repositoryPath in solution-level files
dotnet nuget config set repositoryPath "C:\packages" --configfile "C:\my.config"
dotnet nuget config set repositoryPath "c:\packages" --configfile "..\..\my.config"
# Set repositoryPath in the computer-level file (requires elevation)
dotnet nuget config set repositoryPath "c:\packages" --configfile "%appdata%\NuGet\NuGet.Config"
Mac/Linux:
# Set globalPackagesFolder in the user-level config file
dotnet nuget config set globalPackagesFolder /home/packages
# Set repositoryPath (available for packages.config only) in the user-level config file
dotnet nuget config set repositoryPath /home/packages
# Set repositoryPath in solution-level files
dotnet nuget config set repositoryPath /home/projects/packages --configfile /home/my.Config
dotnet nuget config set repositoryPath /home/packages --configfile home/myApp/NuGet.Config
# Set repositoryPath in the computer-level file (requires elevation)
dotnet nuget config set repositoryPath /home/packages --configfile $XDG_DATA_HOME/NuGet.Config
注意
在 NuGet 3.4 及更高版本中,可以在任何值中使用环境变量,与在 repositoryPath=%PACKAGEHOME%
(Windows) 和 repositoryPath=$PACKAGEHOME
(Mac/Linux) 中类似。
删除值
若要删除值,请指定具有空值的键。
# Windows
nuget config -set repositoryPath= -configfile c:\my.Config
# Mac/Linux
nuget config -set repositoryPath= -configfile /home/my.Config
创建新配置文件
使用 .NET CLI 运行 dotnet new nugetconfig
,创建默认 nuget.config。
有关详细信息,请参阅 dotnet CLI 命令。
也可以将下方的模板手动复制到新文件中,然后使用 nuget config -configFile <filename>
设置值:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
</configuration>
如何应用设置
可使用多个 NuGet.Config
文件在不同位置存储设置,以便设置可应用于单个解决方案、一组解决方案或所有解决方案。
这些设置共同应用于从命令行或 Visual Studio 调用的任何 NuGet 操作,并且优先应用“最靠近”解决方案或当前文件夹的设置。
如果在项目文件(而不是解决方案文件)上使用命令行工具,则项目目录将用作“解决方案目录”,当解决方案文件的子目录中有 NuGet.Config
文件时,这可能会导致行为不一致。
具体来说,当没有在命令行上显式指定配置文件时,NuGet 会按以下顺序从不同的配置文件加载设置:
- (非常见)
NuGetDefaults.Config
文件,仅包含与包源相关的设置。 - 计算机级文件。
- 用户级文件。
- 在从驱动器根到当前文件夹的路径中的每个文件夹中找到的文件(调用
nuget.exe
的位置或包含 Visual Studio 解决方案的文件夹)。 例如,如果在c:\A\B\C
中调用命令,NuGet 将查找并加载c:\
中的配置文件,然后是c:\A
、c:\A\B
,最后是c:\A\B\C
。
当在命令行上显式指定配置文件(例如 nuget -configFile my.config
或 dotnet restore --configfile my.config
)时,将仅使用指定文件中的设置。
NuGet 在这些文件中找到设置时,设置将按如下方式应用:
- 对于单项元素,NuGet 将替换以前找到的具有相同键的值。 也就是说,“最靠近”当前文件夹或解决方案的设置将替代之前找到的任何其他设置。 例如,如果
NuGetDefaults.Config
中的defaultPushSource
设置存在于任何其他配置文件中,则此设置将被替代。 - 对于集合元素(如
<packageSources>
),NuGet 会将所有配置文件中的值合并到一个集合中。 - 当给定节点中存在
<clear />
时,NuGet 将忽略之前为该节点定义的配置值。
提示
在解决方案存储库的根目录中添加 nuget.config
文件。 这被认为是一种最佳做法,因为它促进了可重复性,并可确保不同的用户具有相同的 NuGet 配置。
设置演练
假设两个独立的驱动器上具有以下文件夹结构:
disk_drive_1
User
disk_drive_2
Project1
Source
Project2
Source
tmp
随后以下位置上将有 4 个具有给定内容的 NuGet.Config
文件。 (此示例不包括计算机级文件,但其与用户级文件具有相似行为。)
文件 A. 用户级文件(Windows 上为 %appdata%\NuGet\NuGet.Config
,Mac/Linux 上为 ~/.config/NuGet/NuGet.Config
):
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="nuget" value="https://api.nuget.org/v3/index.json" />
</packageSources>
</configuration>
文件 B. disk_drive_2/NuGet.Config
:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<config>
<add key="repositoryPath" value="disk_drive_2/tmp" />
</config>
<packageRestore>
<add key="enabled" value="True" />
</packageRestore>
</configuration>
文件 C. disk_drive_2/Project1/NuGet.Config
:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<config>
<add key="repositoryPath" value="External/Packages" />
<add key="defaultPushSource" value="https://MyPrivateRepo/ES/api/v2/package" />
</config>
<packageSources>
<clear /> <!-- ensure only the sources defined below are used -->
<add key="MyPrivateRepo - ES" value="https://MyPrivateRepo/ES/nuget" />
</packageSources>
</configuration>
文件 D. disk_drive_2/Project2/NuGet.Config
:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<!-- Add this repository to the list of available repositories -->
<add key="MyPrivateRepo - DQ" value="https://MyPrivateRepo/DQ/nuget" />
</packageSources>
</configuration>
接下来,NuGet 将按如下方式加载和应用设置,具体取决于调用设置的位置:
从
disk_drive_1/users
调用:仅使用用户级配置文件 (A) 中列出的默认存储库,因为这是disk_drive_1
中的唯一文件。从
disk_drive_2/
或disk_drive_/tmp
调用:首先加载用户级文件 (A),然后 NuGet 转到disk_drive_2
的根目录并查找文件 (B)。 NuGet 还会在/tmp
中查找配置文件,但找不到该文件。 因此,此时将使用nuget.org
上的默认存储库、启用包还原并在disk_drive_2/tmp
中展开包。从
disk_drive_2/Project1
或disk_drive_2/Project1/Source
调用:首先加载用户级文件 (A),然后 NuGet 从disk_drive_2
的根目录依次加载文件 (B) 和文件 (C)。 (C) 中的设置会替代 (B) 和 (A) 中的设置,因此安装包的repositoryPath
将为disk_drive_2/Project1/External/Packages
,而非disk_drive_2/tmp
。 此外,由于 (C) 清除了<packageSources>
,因此 nuget.org 将不再可用作源,并仅留下https://MyPrivateRepo/ES/nuget
。从
disk_drive_2/Project2
或disk_drive_2/Project2/Source
调用:首先加载用户级文件 (A),然后依次加载文件 (B) 和文件 (D)。 由于未清除packageSources
,因此nuget.org
和https://MyPrivateRepo/DQ/nuget
都可用作源。 按 (B) 中的指定,包将在disk_drive_2/tmp
中展开。
其他用户范围配置
从版本 5.7 开始,NuGet 添加了对其他用户范围配置文件的支持。 此更新允许第三方供应商在不升级的情况下添加其他用户配置文件。
这些配置文件位于 config
子文件夹内的标准用户范围配置文件夹中。
将考虑以 .config
或 .Config
结尾的所有文件。
标准工具无法编辑这些文件。
OS 平台 | 其他配置 |
---|---|
Windows | %appdata%\NuGet\config\*.Config |
Mac/Linux | ~/.config/NuGet/config/*.config 或 ~/.nuget/config/*.config |
NuGet 默认文件
NuGetDefaults.Config
文件不常见,仅可以指定通过其安装和更新包的包源,或控制使用 nuget push
发布包的默认目标。
由于管理员可以便捷地向开发人员和生成计算机部署一致的 NuGetDefaults.Config
文件(例如,使用组策略),因此他们可以确保组织中的每个人都在使用一致的包源,无论其中是否包含 nuget.org。
重要
NuGetDefaults.Config
文件绝不会导致开发人员 NuGet 配置中的包源被删除。 也就是说,如果开发人员已使用 NuGet,即意味着已注册 nuget.org 包源,创建 NuGetDefaults.Config
文件后将不会删除此包源。
此外,无论 NuGetDefaults.Config
还是 NuGet 中的任何其他机制都无法阻止访问包源(如 nuget.org)。如果组织希望阻止此类访问,则必须使用其他方式(如防火墙)执行此操作。
NuGetDefaults.Config
位置
下表根据目标操作系统描述 NuGetDefaults.Config
文件应存储的位置:
OS 平台 | NuGetDefaults.Config 位置 |
---|---|
Windows | Visual Studio 2017 或 NuGet 4.x+:%ProgramFiles(x86)%\NuGet Visual Studio 2015 及更低版本或 NuGet 3.x 及更低版本: %PROGRAMDATA%\NuGet |
Mac/Linux | $XDG_DATA_HOME (通常为 ~/.local/share 或 /usr/local/share ,具体视 OS 版本而定) |
NuGetDefaults.Config 的设置
packageSources
:此集合与常规配置文件中的packageSources
具有相同含义,并可指定默认源。 在使用packages.config
管理格式的项目中安装或更新包时,NuGet 会按顺序使用源。 对于使用 PackageReference 格式的项目,NuGet 会先使用本地源,再使用网络共享上的源,最后使用 HTTP 源,而不管配置文件中的顺序如何。 NuGet 会始终忽略还原操作的源顺序。disabledPackageSources
:此集合还与在NuGet.Config
文件中时具有相同含义,集合中将列出每个受影响源的名称,并用true
/false
值指示源是否已禁用。 这可使源名称和 URL 保留在packageSources
中,但不会将其默认打开。 单个开发人员随后可在其他NuGet.Config
文件中将源的值设置为false
,以便重新启用源,而无需再次寻找正确的 URL。 开发人员还可通过此方法获取组织的内部源 URL 完整列表,同时仅默认启用一个团队的源。defaultPushSource
:指定nuget push
操作的默认目标,同时替代nuget.org
的内置默认值。 管理员可部署此设置以避免误将内部包发布到公共nuget.org
,因为开发人员专门负责使用nuget push -Source
向nuget.org
发布。
示例 NuGetDefaults.Config 和应用程序
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- defaultPushSource key works like the 'defaultPushSource' key of NuGet.Config files. -->
<!-- This can be used by administrators to prevent accidental publishing of packages to nuget.org. -->
<config>
<add key="defaultPushSource" value="https://contoso.com/packages/" />
</config>
<!-- Default Package Sources; works like the 'packageSources' section of NuGet.Config files. -->
<!-- This collection cannot be deleted or modified but can be disabled/enabled by users. -->
<packageSources>
<add key="Contoso Package Source" value="https://contoso.com/packages/" />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
</packageSources>
<!-- Default Package Sources that are disabled by default. -->
<!-- Works like the 'disabledPackageSources' section of NuGet.Config files. -->
<!-- Sources cannot be modified or deleted either but can be enabled/disabled by users. -->
<disabledPackageSources>
<add key="nuget.org" value="true" />
</disabledPackageSources>
</configuration>