-
Notifications
You must be signed in to change notification settings - Fork 4.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Split library and package Readme #78888
Changes from 6 commits
a9d577f
944daa0
170adeb
fc32b96
1f95da5
1b0a89e
ea477be
053003e
f091280
368609c
af34dcf
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -11,6 +11,7 @@ | |||||
<!-- Don't include target platform specific dependencies, since we use the target platform to represent RIDs instead --> | ||||||
<SuppressDependenciesWhenPacking Condition="'$(TargetPlatformIdentifier)' != ''">true</SuppressDependenciesWhenPacking> | ||||||
<PackageDesignerMarkerFile>$(MSBuildThisFileDirectory)useSharedDesignerContext.txt</PackageDesignerMarkerFile> | ||||||
<PackageReadmeFile Condition="'$(PackageReadmeFile)' == '' and Exists('PACKAGE.md')">PACKAGE.md</PackageReadmeFile> | ||||||
<!-- Generate packages for rid specific projects or for allconfigurations during build. --> | ||||||
<!-- A package isn't generated if in servicing or in runtimelab. Intended to be overridden at project level. --> | ||||||
<IsRIDSpecificProject Condition="$(MSBuildProjectName.StartsWith('runtime.')) and | ||||||
|
@@ -57,6 +58,11 @@ | |||||
TargetFramework="$(NetFrameworkMinimum)" /> | ||||||
</ItemGroup> | ||||||
|
||||||
<!-- Add a package README file from. --> | ||||||
<ItemGroup Condition="'$(PackageReadmeFile)' != ''"> | ||||||
<None Include="$(PackageReadmeFile)" Pack="true" PackagePath="\" /> | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
You want the file to be named There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We don't have to specify name README.md, NuGet will recognize any name set by PackageReadmeFile property. Also PackagePath seems to be a path without name, it is used like that in docs: https://learn.microsoft.com/en-us/nuget/reference/msbuild-targets#packagereadmefile |
||||||
</ItemGroup> | ||||||
|
||||||
<Choose> | ||||||
<When Condition="'$(AddXamarinPlaceholderFilesToPackage)' == 'true' or '$(AddNETFrameworkPlaceholderFileToPackage)' == 'true'"> | ||||||
<PropertyGroup> | ||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
## About | ||
|
||
Provides abstractions of key-value pair based configuration. Interfaces defined in this package are implemented by classes in [Microsoft.Extensions.Configuration](https://www.nuget.org/packages/Microsoft.Extensions.Configuration/) and other configuration packages. | ||
|
||
Commonly used types: | ||
|
||
- [Microsoft.Extensions.Configuration.IConfiguration](https://learn.microsoft.com/dotnet/api/microsoft.extensions.configuration.iconfiguration) | ||
- [Microsoft.Extensions.Configuration.IConfigurationBuilder](https://learn.microsoft.com/dotnet/api/microsoft.extensions.configuration.iconfigurationbuilder) | ||
- [Microsoft.Extensions.Configuration.IConfigurationProvider](https://learn.microsoft.com/dotnet/api/microsoft.extensions.configuration.iconfigurationprovider) | ||
- [Microsoft.Extensions.Configuration.IConfigurationRoot](https://learn.microsoft.com/dotnet/api/microsoft.extensions.configuration.iconfigurationroot) | ||
- [Microsoft.Extensions.Configuration.IConfigurationSection](https://learn.microsoft.com/dotnet/api/microsoft.extensions.configuration.iconfigurationsection) | ||
|
||
For more information, see the documentation: [Configuration in .NET](https://learn.microsoft.com/dotnet/core/extensions/configuration). | ||
|
||
## Example | ||
|
||
The example below shows a small code sample using this library and trying out the `ConfigurationKeyName` attribute available since .NET 6: | ||
|
||
```cs | ||
public class MyClass | ||
{ | ||
[ConfigurationKeyName("named_property")] | ||
public string NamedProperty { get; set; } | ||
} | ||
``` | ||
|
||
Given the simple class above, we can create a dictionary to hold the configuration data and use it as the memory source to build a configuration section: | ||
|
||
```cs | ||
var dic = new Dictionary<string, string> | ||
{ | ||
{"named_property", "value for named property"}, | ||
}; | ||
|
||
var config = new ConfigurationBuilder() | ||
.AddInMemoryCollection(dic) | ||
.Build(); | ||
|
||
var options = config.Get<MyClass>(); | ||
Console.WriteLine(options.NamedProperty); // returns "value for named property" | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,91 +1,13 @@ | ||
# Microsoft.Extensions.Configuration.Binder | ||
|
||
Provides the functionality to bind an object to data in configuration providers for [Microsoft.Extensions.Configuration](https://www.nuget.org/packages/Microsoft.Extensions.Configuration/). This package enables you to represent the configuration data as strongly-typed classes defined in the application code. To bind a configuration, use the [Microsoft.Extensions.Configuration.ConfigurationBinder.Get](https://learn.microsoft.com/dotnet/api/microsoft.extensions.configuration.configurationbinder.get) extension method on the `IConfiguration` object. To use this package, you also need to install a package for the [configuration provider](https://learn.microsoft.com/dotnet/core/extensions/configuration#configuration-providers), for example, [Microsoft.Extensions.Configuration.Json](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Json/) for the JSON provider. | ||
Provides the functionality to bind an object to data in configuration providers for [Microsoft.Extensions.Configuration](https://www.nuget.org/packages/Microsoft.Extensions.Configuration/). | ||
|
||
Documentation can be found at https://learn.microsoft.com/dotnet/core/extensions/configuration | ||
|
||
## Contribution Bar | ||
- [x] [We consider new features, new APIs, bug fixes, and performance changes](https://github.com/dotnet/runtime/tree/main/src/libraries#contribution-bar) | ||
- [x] [We consider new features, new APIs, bug fixes, and performance changes](../README.md#contribution-bar) | ||
|
||
The APIs and functionality are mature, but do get extended occasionally. | ||
|
||
## Deployment | ||
[Microsoft.Extensions.Configuration.Binder](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Binder/) is included in the ASP.NET Core shared framework. The package is deployed as out-of-band (OOB) too and can be referenced into projects directly. | ||
|
||
## Example | ||
The following example shows how to bind a JSON configuration section to .NET objects. | ||
|
||
```cs | ||
using System; | ||
using Microsoft.Extensions.Configuration; | ||
|
||
class Settings | ||
{ | ||
public string Server { get; set; } | ||
public string Database { get; set; } | ||
public Endpoint[] Endpoints { get; set; } | ||
} | ||
|
||
class Endpoint | ||
{ | ||
public string IPAddress { get; set; } | ||
public int Port { get; set; } | ||
} | ||
|
||
class Program | ||
{ | ||
static void Main() | ||
{ | ||
// Build a configuration object from JSON file | ||
IConfiguration config = new ConfigurationBuilder() | ||
.AddJsonFile("appsettings.json") | ||
.Build(); | ||
|
||
// Bind a configuration section to an instance of Settings class | ||
Settings settings = config.GetSection("Settings").Get<Settings>(); | ||
|
||
// Read simple values | ||
Console.WriteLine($"Server: {settings.Server}"); | ||
Console.WriteLine($"Database: {settings.Database}"); | ||
|
||
// Read nested objects | ||
Console.WriteLine("Endpoints: "); | ||
|
||
foreach (Endpoint endpoint in settings.Endpoints) | ||
{ | ||
Console.WriteLine($"{endpoint.IPAddress}:{endpoint.Port}"); | ||
} | ||
} | ||
} | ||
``` | ||
|
||
To run this example, include an `appsettings.json` file with the following content in your project: | ||
|
||
```json | ||
{ | ||
"Settings": { | ||
"Server": "example.com", | ||
"Database": "Northwind", | ||
"Endpoints": [ | ||
{ | ||
"IPAddress": "192.168.0.1", | ||
"Port": "80" | ||
}, | ||
{ | ||
"IPAddress": "192.168.10.1", | ||
"Port": "8080" | ||
} | ||
] | ||
} | ||
} | ||
``` | ||
|
||
You can include a configuration file using a code like this in your `.csproj` file: | ||
|
||
```xml | ||
<ItemGroup> | ||
<Content Include="appsettings.json"> | ||
<CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||
</Content> | ||
</ItemGroup> | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
## About | ||
|
||
Provides the functionality to bind an object to data in configuration providers for [Microsoft.Extensions.Configuration](https://www.nuget.org/packages/Microsoft.Extensions.Configuration/). This package enables you to represent the configuration data as strongly-typed classes defined in the application code. To bind a configuration, use the [Microsoft.Extensions.Configuration.ConfigurationBinder.Get](https://learn.microsoft.com/dotnet/api/microsoft.extensions.configuration.configurationbinder.get) extension method on the `IConfiguration` object. To use this package, you also need to install a package for the [configuration provider](https://learn.microsoft.com/dotnet/core/extensions/configuration#configuration-providers), for example, [Microsoft.Extensions.Configuration.Json](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Json/) for the JSON provider. | ||
|
||
For more information, see the documentation: [Configuration in .NET](https://learn.microsoft.com/dotnet/core/extensions/configuration). | ||
|
||
## Example | ||
The following example shows how to bind a JSON configuration section to .NET objects. | ||
|
||
```cs | ||
using System; | ||
using Microsoft.Extensions.Configuration; | ||
|
||
class Settings | ||
{ | ||
public string Server { get; set; } | ||
public string Database { get; set; } | ||
public Endpoint[] Endpoints { get; set; } | ||
} | ||
|
||
class Endpoint | ||
{ | ||
public string IPAddress { get; set; } | ||
public int Port { get; set; } | ||
} | ||
|
||
class Program | ||
{ | ||
static void Main() | ||
{ | ||
// Build a configuration object from JSON file | ||
IConfiguration config = new ConfigurationBuilder() | ||
.AddJsonFile("appsettings.json") | ||
.Build(); | ||
|
||
// Bind a configuration section to an instance of Settings class | ||
Settings settings = config.GetSection("Settings").Get<Settings>(); | ||
|
||
// Read simple values | ||
Console.WriteLine($"Server: {settings.Server}"); | ||
Console.WriteLine($"Database: {settings.Database}"); | ||
|
||
// Read nested objects | ||
Console.WriteLine("Endpoints: "); | ||
|
||
foreach (Endpoint endpoint in settings.Endpoints) | ||
{ | ||
Console.WriteLine($"{endpoint.IPAddress}:{endpoint.Port}"); | ||
} | ||
} | ||
} | ||
``` | ||
|
||
To run this example, include an `appsettings.json` file with the following content in your project: | ||
|
||
```json | ||
{ | ||
"Settings": { | ||
"Server": "example.com", | ||
"Database": "Northwind", | ||
"Endpoints": [ | ||
{ | ||
"IPAddress": "192.168.0.1", | ||
"Port": "80" | ||
}, | ||
{ | ||
"IPAddress": "192.168.10.1", | ||
"Port": "8080" | ||
} | ||
] | ||
} | ||
} | ||
``` | ||
|
||
You can include a configuration file using a code like this in your `.csproj` file: | ||
|
||
```xml | ||
<ItemGroup> | ||
<Content Include="appsettings.json"> | ||
<CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||
</Content> | ||
</ItemGroup> | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,37 +1,13 @@ | ||
# Microsoft.Extensions.Configuration.CommandLine | ||
|
||
Command line configuration provider implementation for [Microsoft.Extensions.Configuration](https://www.nuget.org/packages/Microsoft.Extensions.Configuration/). This package enables you to read configuration parameters from the command line arguments of your application. You can use [CommandLineConfigurationExtensions.AddCommandLine](https://learn.microsoft.com/dotnet/api/microsoft.extensions.configuration.commandlineconfigurationextensions.addcommandline) extension method on `IConfigurationBuilder` to add the command line configuration provider to the configuration builder. | ||
Command line configuration provider implementation for [Microsoft.Extensions.Configuration](https://www.nuget.org/packages/Microsoft.Extensions.Configuration/). | ||
|
||
Documentation can be found at https://learn.microsoft.com/dotnet/core/extensions/configuration-providers#command-line-configuration-provider | ||
|
||
## Contribution Bar | ||
- [x] [We consider new features, new APIs, bug fixes, and performance changes](https://github.com/dotnet/runtime/tree/main/src/libraries#contribution-bar) | ||
- [x] [We consider new features, new APIs, bug fixes, and performance changes](../README.md#contribution-bar) | ||
|
||
The APIs and functionality are mature, but do get extended occasionally. | ||
|
||
## Deployment | ||
[Microsoft.Extensions.Configuration.CommandLine](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.CommandLine/) is included in the ASP.NET Core shared framework. The package is deployed as out-of-band (OOB) too and can be referenced into projects directly. | ||
|
||
## Example | ||
|
||
The following example shows how to read application configuration from the command line. You can use a command like `dotnet run --InputPath "c:\fizz" --OutputPath "c:\buzz"` to run it. | ||
|
||
```cs | ||
using System; | ||
using Microsoft.Extensions.Configuration; | ||
|
||
class Program | ||
{ | ||
static void Main(string[] args) | ||
{ | ||
// Build a configuration object from command line | ||
IConfiguration config = new ConfigurationBuilder() | ||
.AddCommandLine(args) | ||
.Build(); | ||
|
||
// Read configuration values | ||
Console.WriteLine($"InputPath: {config["InputPath"]}"); | ||
Console.WriteLine($"OutputPath: {config["OutputPath"]}"); | ||
} | ||
} | ||
``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe the file name could be
PACKAGE_README.md
?PACKAGE.md
doesn't really describe exactly what the file is.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When it comes to NuGet Gallery, the PACKAGE.md file is automatically respected and displayed as the package's nuspec encodes it. Personally, I'm fine with the
PACKAGE.md
name and I don't think it's common that a dev crack opens a nuget package in order to understand how to use it.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's more about readability/understandability of the files in the repo.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Other options include:
PackageReadme.md
docs
folder, and still name itREADME.md
. e.g.src/docs/README.md
src
- they could both be namedREADME.md
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The PACKAGE.md choice was based on this suggestion: #59630 (comment) I don't think this name needs to be long as there's not a lot of .md files in folder to disambiguate between them. So personally i'd prefer either README.md or PACKAGE.md.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Being able to distinguish between a package documentation file and a repo specific contribution guidance seems valuable to me. We unintentionally started shipping the contribution guidance files to customers and this PR fixes that: #59630 (comment).