dotnet add package DotNetConfig --version 1.2.0                
NuGet\Install-Package DotNetConfig -Version 1.2.0                
该命令可在此 Visual Studio 的包管理器控制台中使用,因为它使用 NuGet 模块的 Install-Package 版本。
<PackageReference Include="DotNetConfig" Version="1.2.0" />                
对于支持 PackageReference 的项目,请将此 XML 节点复制到项目文件中以引用包。
paket add DotNetConfig --version 1.2.0                
#r "nuget: DotNetConfig, 1.2.0"                
#r 指令可用于 F# Interactive 和多语言笔记本。将此内容复制到交互式工具或脚本的源代码中以引用包。
// Install DotNetConfig as a Cake Addin
#addin nuget:?package=DotNetConfig&version=1.2.0

// Install DotNetConfig as a Cake Tool
#tool nuget:?package=DotNetConfig&version=1.2.0                

为什么

dotnet-config(或.netconfig)为.NET Core工具提供了一个统一的机制,以便以可预测的格式存储和读取配置值,这些值可以通过命令行工具、API以及用户通过任何文本编辑器手动操纵。

就像git config为所有 git 命令提供了一个统一的存储设置方式一样,dotnet-config的目标是在所有 .NET 工具之间保持一致性的水平。格式也与它(主要)兼容,因此利用了 git 社区关于配置任意工具的学习。

这是什么

dotnet-config提供以下功能:

  • 任何文本编辑器都可以手工编辑的良好文档文件格式。
  • 一个 .NET 全局工具,用于管理配置文件(类似于 git config)。
  • 为 dotnet 工具作者提供的 API,用于读取/写入设置。

默认情况下,配置文件命名为 .netconfig,并支持四种存储级别

文件将按上述顺序读取,首先找到的值具有优先权。当读取多个值时,将返回所有文件的键的所有值。

.netconfig.user 可以用来将仅限于本地的设置在源控制中与团队设置分开,并且它已经在 .gitignore 中被广泛忽略。

以下是一些利用 .netconfig 提供灵活配置持久性选项的工具

dotnet-eventgrid dotnet-file dotnet-serve dotnet-vs reportgenerator sleet

在我们文档网站的 Who 部分了解更多有关各种工具如何利用 .netconfig 的信息。

如何

格式

示例文件

# .netconfig is awesome: https://dotnetconfig.org

[serve]
	port = 8080
	gzip                    #shorthand for gzip=true

[vs "alias"]
	comexp = run|community|exp
	preexp = run|preview|exp

[file]
	# example of multi-valued variables
	url = https://github.com/dotnet/runtime/tree/master/docs/design/features
	url = https://github.com/dotnet/aspnetcore/tree/master/docs

; subsections allow grouping variables
[file "docs/design/features/code-versioning.md"]
	url = https://github.com/dotnet/runtime/blob/master/docs/design/features/code-versioning.md
	etag = 7405567...

[file "docs/APIReviewProcess.md"]
	url = https://github.com/dotnet/aspnetcore/blob/master/docs/APIReviewProcess.md
	etag = 1e4acd7...

[mytool]
    description = "\t tab and \n newline escapes, plus \\ backslash are valid"
    title = My tool is great    # internal whitespace preserved without needing double quotes
    path = C:\\tool             # backslashes always escaped, inside or outside double quotes
    size = 500kb                # numbers can have a multiplier (case insensitive) suffix kb, mb, gb, tb 
    max-size = 1T               # the 'b' is optional.
    compress = true             # multiple variants for boolean: true|false|yes|no|on|off|1|0
    secure   = yes
    localized = off
    enabled  = 1

; array like syntax for complex objects
[myArray "0"] # indecies must be unique
    description = 1st item description
    name = Fero
[myArray "1"]
    description = 2nd item description
    name = Jozo

语法与 git-config 语法 非常相似。字符 #; 开始直到行尾的注释,空白行被忽略。

文件由 部分变量 组成。一个部分以方括号中的部分名为开头,直到下一个部分开始。部分名不区分大小写。部分名中只允许使用字母数字字符和 -。每个变量必须属于某个部分,这意味着在变量的第一个设置之前必须有一个部分标题。

部分可以进一步分为 子部分。要开始一个子部分,将在部分标题中将其名称放入双引号中,并与部分名称用空格分隔,例如下面的示例。

[section "subsection"]

子部分名区分大小写,可以包含任何字符,但不能包含换行符。双引号 " 和反斜杠 \ 可以通过分别作为 \"\\ 转义来包含。

部分标题不能跨越多行。变量可以直接属于一个部分或一个特定的子部分。如果您已经有了 [section "subsection"],则可以省略 [section],但如果要包含子部分,则不需要省略。

所有其他行都被识别为 变量 的设置,形式为 名称 = 值(或仅 名称,它是布尔值 true 的快捷方式)。变量名不区分大小写,仅允许字母数字字符和 -,必须以字母开头。变量可以出现多次;我们说变量是 多值的

名称 = 之后的前导空白,第一行注释字符 #; 之后的行剩余部分,以及行的尾随空白被丢弃,除非它们被双引号包围。值内部保留的空白以原始形式保留。

反斜杠 \ 字符必须始终使用 \\ 转义。双引号必须通过 \" 转义或正确配对,这将在内部保留空白。

除了 \"\\ 之外,还认可 \n(换行符 NL)和 \t(水平制表符 HT, TAB)转义序列。

注意:当使用 CLI 或 API 时,这些转义规则将自动应用

许多变量的值被处理为简单的字符串,但有一些变量接受特定类型的值,存在关于如何拼写的规则。

  • 布尔值

    当变量提到要接受一个 布尔值 时,许多同义词都接受 truefalse;这些都不区分大小写。

    • true:布尔值的真文字是 yesontrue1。此外,未定义 =<值> 的变量被视为 true

    • false:布尔值的假文字是 noofffalse0 以及空字符串。

  • 日期时间

    此类型的变量始终使用ISO 8601格式(或圆旅行格式)解析/写入。

  • 数字

    对于表示各种大小的许多变量的值,可以用kMGT后缀来表示“将数字乘以1024”、“乘以1024x1024”、“乘以1024x1024x1024”或“乘以1024x1024x1024x1024”分别。后缀的大小写不敏感,也可以包括b,如kbMB

复杂对象的数组

通过子节,可以在数组中创建更复杂的对象。假设我们有以下配置对象

public class WatchedProcess
{
    public string Name { get; set; }
    public string ApplicationPath { get; set; }
}

我们希望将配置作为IList<WatchedProcess>检索出来。即使git-config语法没有直接支持这种情况,我们也能通过子节和ConfigurationRoot来创建复杂对象的列表。

ConfigurationRoot支持通过使用项目索引作为“子节”创建数组来处理数组。这使得我们可以创建一个选择器,它会根据元素索引从数组中选取值。例如,WatchedProcess:0:Name会选择数组的第一个项目中的Name值。这意味着我们可以在子节中使用索引,并按如下方式创建复杂对象的数组

[WatchedProcesses "0"] # indicies must be unique
	ApplicationPath = "C:\\MyProcessPath\ABCD"
	Name = NServiceBus.Host

[WatchedProcesses "1"] # indicies must be unique
	ApplicationPath = "C:\\MyProcessPath2\ABCD"
	Name = NServiceBus.Host

[WatchedProcesses "2"] # indicies must be unique
	ApplicationPath = "C:\\MyProcessPath2\ABCD"
	Name = NServiceBus.Host

使用此配置,我们可以按以下方式检索复杂对象的数组

var configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddDotNetConfig();
var configurationRoot = configurationBuilder.Build();
var watchedProcesses = configurationRoot.GetSection(nameof(WatchedProcess)).Get<IList<Json.Appsettings.WatchedProcess>>();

注意:确保您的数组项目具有唯一的索引

API

访问.netconfig值有三种主要方式

本地API

Version Downloads

PM> Install-Package DotNetConfig

.NET工具作者消耗DotNetConfig API的主要用途是首先从一个特定的路径(如果省略,则假定当前目录)构建配置

var config = Config.Build();

生成的配置将包含当前目录(或给定的路径)中设置的分层变量,还包括所有其祖先目录、全局和系统位置。

获取值时,支持的原始数据类型(布尔值、日期时间、数字和字符串)暴露为第一级方法,例如AddGetSet,因此您会为每个BooleanDateTimeNumberString获得许多可用的重载,例如AddBooleanGetDateTimeGetStringSetNumber

// reads from:
// [mytool]
//   enabled = true

bool? enabled = config.GetBoolean("mytool", "enabled");

// reads from:
// [mytool.editor]
//   path = code.exe

string? path = config.GetString("mytool.editor", "path");


// reads from:
// [mytool "src/file.txt"]
//   createdOn = 2020-08-23T12:00:00Z

DateTime? created = config.GetDateTime("mytool", "src/file.txt", "createdOn");
// If value was not found, set it to the current datetime
if (created == null)
    // Would create the section if it did not previously exist, and add the variable
    config.SetDateTime("mytool", "src/file.txt", "createdOn", DateTime.Now);

或者你可以使用TryGetXXX方法来代替,以避免在变量(在请求的节和可选子节中)找不到时检查空值返回

if (!config.TryGetDateTime("mytool", "src/file.txt", "createdOn", out created))
    config.SetDateTime("mytool", "src/file.txt", "createdOn", DateTime.Now);

由于.netconfig支持多值变量,你可以通过ConfigEntry获取所有条目并逐一检查或修改它们

foreach (ConfigEntry entry in config.GetAll("proxy", "url"))
{
    // entry.Level allows inspecting the location where the entry was read from
    if (entry.Level == ConfigLevel.System)
        // entry came from Environment.SpecialFolder.System
    else if (entry.Level == ConfigLevel.Global)
        // entry came from Environment.SpecialFolder.UserProfile
    else if (entry.Level == ConfigLevel.Local)
        // entry came from .netconfig.user file in the current dir or an ancestor directory
    else
        // local entry from current dir .netconfig or an ancestor directory

    Console.WriteLine(entry.GetString());
    // entry.GetBoolean(), entry.GetDateTime(), entry.GetNumber()
}

在写入值(通过AddXXXSetXXX)时,你可以通过传递一个ConfigLevel来指定一个用于持久化值的配置级别

// writes on the global .netconfig in the user's profile
//[vs "alias"]
//	comexp = run|community|exp

config.AddString("vs", "alias", "comexp", "run|community|exp", ConfigLevel.Global);

您可以在文档站点中探索整个API。

Microsoft.Extensions.Configuration

Version Downloads

PM> Install-Package DotNetConfig.Configuration

使用(在此示例中,也链其他提供程序)

var config = new ConfigurationBuilder()
    .AddJsonFile(...)
    .AddEnvironmentVariables()
    .AddIniFile(...)
    .AddDotNetConfig();

给定以下.netconfig

[serve]
	port = 8080

[security "admin"]
    timeout = 60

您可以读取两个值

string port = config["serve:port"];  // == "8080";
string timeout = config["security:admin:timeout"];  // == "60";

System.CommandLine

Version Downloads

为了让< **.netconfig** >在(dotnet)(全局)工具中成为第一级元素,它提供了与System.CommandLine无缝集成的出色功能。

让我们假设你创建了一个名为package的CLI应用程序,该应用程序管理你本地的包缓存(即NuGet)。你可能有几个命令,如downloadprune

var root = new RootCommand
{
  new Command("download")
  {
    new Argument<string>("id")
  },
  new Command("prune")
  {
    new Argument<string>("id"),
    new Option<int>("days")
  },
}.WithConfigurableDefaults("package");

添加的 WithConfigurableDefaults 调用意味着现在所有的参数和选项都可以在配置文件中指定默认值,例如

[package]
  id = DotNetConfig

[package "prune"]
  days = 30

注意如何在上层也可以指定 id。只要具有兼容的类型(在 downloadprune 命令中两者都定义为了 string),集成会自动将可配置的值提升到上层部分。

现在在命令行中运行 package -? 将从配置文件中拉取渲染后的默认值,因此您可以看到在没有值的情况下运行命令会实际使用什么值。

Usage:
  package [options] [command]

Options:
  --version       Show version information
  -?, -h, --help  Show help and usage information

Commands:
  download <id>  [default: DotNetConfig]
  prune <id>     [default: DotNetConfig]

package prune -? 将显示

Usage:
  package [options] prune [<id>]

Arguments:
  <id>  [default: DotNetConfig]

Options:
  --days <days>   [default: 30]
  -?, -h, --help  Show help and usage information

由于 .netconfig 支持多值变量,因此非常适合为可以多次指定的参数或选项设置默认值。通过将上面的参数进行如下简单更改

    new Argument<string[]>("id")

我们现在可以支持以下配置

[package]
  id = DotNetConfig
  id = Moq
  id = ThisAssembly

现在在没有 id 参数的情况下运行命令将导致处理程序接收所有三个值。您还可以通过例如 download -? 验证这一点。

Usage:
  package [options] download [<id>...]

Arguments:
  <id>  [default: DotNetConfig|Moq|ThisAssembly]

Options:
  -?, -h, --help  Show help and usage information

System.CommandLine 支持的对于多值参数和选项的所有类型都将自动填充:数组、IEnumerableICollectionIListList

对于数字,参数/选项可以是 longint。请注意,由于 .netconfig 中的数字总是 long,在 int 的情况下可能会发生截断。

CLI

Version Downloads

命令行工具允许您检查和修改您的 dotnet 工具使用的配置文件。与任何其他 dotnet 工具的安装方式相同。

> dotnet tool install -g dotnet-config

可用的选项和动作(大部分)与 git config 的行为兼容。

当从单个文件中读取和写入数据时,您可以使用与兼容性选项 -f|--file 指定读取/写入文件的 git config

读取和写入变量不需要任何特殊选项。以下行首先写入一个变量的值,然后检索它的值

> dotnet config mytool.myvariable myvalue
> dotnet config mytool.myvariable
myvalue

值将原样通过标准输出返回,因此您可以直接将其分配给变量,例如。

运行 dotnet config -? 时显示的所有当前选项

Usage: dotnet config [options]

Location (uses all locations by default)
      --global               use global config file
      --system               use system config file
      --local                use .netconfig.user file
  -f, --file                 use given config file (git config compat)
      --path[=VALUE]         use given config file or directory

Action
      --get                  get value: name [value-regex]
      --get-all              get all values: key [value-regex]
      --get-regexp           get values for regexp: name-regex [value-regex]
      --add                  add a new variable: name value
      --unset                remove a variable: name [value-regex]
      --unset-all            remove all matches: name [value-regex]
      --set                  set value: name value [value-regex]
      --set-all              set all matches: name value [value-regex]
      --rename-section       rename section: old-name new-name
      --remove-section       remove a section: name
  -l, --list                 list all
  -e, --edit                 edit the config file in an editor

Other
      --name-only            show variable names only
      --default[=VALUE]      with --get, use default value when missing entry
      --type[=VALUE]         value is given this type, can be 'boolean', '
                               datetime' or 'number'
  -?, -h, --help             Display this help

命令行解析使用 Mono.Options 完成,因此以下所有参数的变体都得到支持:-flag--flag/flag-flag=value--flag=value/flag=value-flag:value--flag:value/flag:value-flag value--flag value/flag value

赞助商

Clarius Org Kirill Osenkov MFB Technologies, Inc. Stephen Shaw Torutek DRIVE.NET, Inc. Ashley Medway Keith Pickford Thomas Bolon Kori Francis Toni Wenzel Giorgi Dalakishvili Uno Platform Dan Siegel Reuben Swartz Jacob Foshee alternate text is missing from this package README image Eric Johnson Ix Technologies B.V. David JENNI Jonathan Oleg Kyrylchuk Charley Wu Jakob Tikjøb Andersen Seann Alexander Tino Hager Mark Seemann Ken Bonny Simon Cropp agileworks-eu sorahex Zheyu Shen Vezel ChilliCream 4OTC

Sponsor this project  

了解更多关于 GitHub Sponsors 的信息

产品 兼容的和额外的计算目标框架版本。
.NET net5.0 已计算。 net5.0-windows 已计算。 net6.0 已计算。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 已计算。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。
.NET Core netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。
.NET Standard netstandard2.0 兼容。 netstandard2.1 已计算。
.NET Framework net461 已计算。 net462 已计算。 net463 已计算。 net47 已计算。 net471 已计算。 net472 已计算。 net48 已计算。 net481 已计算。
MonoAndroid monoandroid 已计算。
MonoMac monomac 已计算。
MonoTouch monotouch 已计算。
Tizen tizen40 已计算。 tizen60 已计算。
Xamarin.iOS xamarinios 已计算。
Xamarin.Mac xamarinmac 已计算。
Xamarin.TVOS xamarintvos 已计算。
Xamarin.WatchOS xamarinwatchos 已计算。
兼容的目标框架
包含的目标框架(在包中)
有关 目标框架.NET Standard 的更多信息。

NuGet 包 (5)

显示依赖 DotNetConfig 的前 5 个 NuGet 包

下载
ReportGenerator.Core

ReportGenerator可将由coverlet、OpenCover、dotCover、Visual Studio、NCover、Cobertura、JaCoCo、Clover、gcov 或 lcov生成的覆盖率报告转换为多种格式的易于阅读的报告。报告显示覆盖率配额,并可视化哪些源代码行已被覆盖。如果您想为ReportGenerator编写自定义插件或希望在您的代码库中调用/执行ReportGenerator,请使用此包。插件开发:https://github.com/danielpalme/ReportGenerator/wiki/Custom-reports https://github.com/danielpalme/ReportGenerator/wiki/Custom-history-storage

SleetLib

通过Sleet API访问Sleet.exe命令。

dotnet-config

使用git config格式管理dotnet工具的分层配置的全局工具。

DotNetConfig.Configuration

DotNetConfig对Microsoft.Extensions.Configuration的配置提供程序实现。用法:var config = new ConfigurationBuilder().AddDotNetConfig().Build(); var value = config["section:subsection:variable"]; 注意:section是必需的,subsection是可选的,就像在dotnet-config中一样。

DotNetConfig.CommandLine

System.CommandLine 扩展的功能,可自动从 .netconfig 文件读取默认值。用法:var root = new RootCommand { // 子命令,参数,选项 }.WithConfigurableDefaults(); 提供默认值时应用以下启发式规则:* 只有没有默认值的参数/选项被处理。* 部分(Section)与根命令名称匹配,子部分(点分隔)用于每个额外的嵌套命令级别(例如 `[mytool "mycommand.myverb"]`)。* 可兼容的参数/选项(相同名称/类型)可以放置在祖先部分/子部分中,以影响整个子树的默认值。* System.CommandLine 自动填充支持的单个参数和选项的所有类型:数组、`IEnumerable{T}`、`ICollection{T}`、`IList{T}` 和 `List{T}`:.netconfig 可以为这些提供多值变量。* 数字可以是 `int` 或 `long`。

GitHub 仓库 (3)

显示依赖于 DotNetConfig 的前 3 个最受欢迎的 GitHub 仓库

仓库 Stars
danielpalme/ReportGenerator
ReportGenerator 可以将由 coverlet、OpenCover、dotCover、Visual Studio、NCover、Cobertura、JaCoCo、Clover、gcov 或 lcov 生成的覆盖率报告转换成各种格式的易读报告。
natemcmaster/dotnet-serve
用于 .NET Core CLI 的简单命令行 HTTPS 服务器
emgarten/Sleet
用于 Azure Storage、AWS S3 等 的静态 nuget 资源生成器。
版本 下载 最后更新时间
1.2.0 743 7/7/2024
1.1.1 524 6/25/2024
1.1.0 110 6/25/2024
1.0.6 2,666,105 7/30/2021
1.0.5 2,059 7/30/2021
1.0.4 11,379 6/12/2021
1.0.3 3,208 4/29/2021
1.0.0-rc.3 187 4/26/2021
1.0.0-rc.2 68,788 12/21/2020
1.0.0-rc.1 1,296 12/15/2020
1.0.0-rc 111,555 9/6/2020
1.0.0-beta 1,992 9/5/2020