Nuget xdt 转换不适用于配置文件

Nuget xdt transform does not work for config files

我有 .NetStandard 图书馆。我将在 .NetFramework.NetCoreApp 应用程序中使用它。

它使用 System.Configuration.ConfigurationManager 包来处理配置文件。我需要在我的库安装过程中转换这些配置文件。

我找到了两种方法:

  1. tools nuget 包中的文件夹,其中包含 install.ps1 文件
  2. content 文件夹,里面有 app.config.install.xdt 个文件

没有一个是行不通的 - nuget 没有 运行 install.ps1,nuget 没有转换 App.config

有来自csproj的代码:

<ItemGroup>
  <Content Include="Content\app.config.install.xdt">
    <PackagePath>content</PackagePath>
  </Content>
</ItemGroup>

Nuget 包包含这个文件...所以我不知道为什么它不起作用。

这个问题与.NetStandard有关吗?我做错了什么?

执行 ps1 脚本和 XDT 转换都是仅适用于 packages.config、but not PackageReference 的功能。 .NET Core(我认为是 .NET Standard)项目只适用于 SDK 风格的项目,而 SDK 风格的项目只支持 PackageReference。 Packages.config 仅适用于 "old-style" 个项目,这些项目也可能是 PackageReference。

Microsoft 的 ASP.NET 核心库处理这种差异的方式是它们不再直接从 web.config 读取设置。相反,该程序必须注册将修改现有内存中选项对象的回调函数。例如

services.AddMyService(options =>
    {
        options.setting = newValue;
    });

这对您的用户有一些好处。

  1. 它们不再局限于将配置值存储在库作者要求的位置。他们可以选择从数据库、配置服务、xml 文件、json 文件加载配置,或者只是在应用程序中对其进行硬编码。但它可以让每个开发人员选择最适合自己系统的东西。
  2. 如果用户覆盖了软件包在配置文件中的设置,并且软件包的每次更新都覆盖了用户的首选项,用户会因为软件包不尊重他们更改默认设置的选择而感到恼火。
  3. 如果用户不想覆盖包放在配置文件中的设置,并且包作者不想每次更新都覆盖配置文件,那么包作者很难更改默认值。

ASP.NET Core 的新模型对每个人都更好,因为包作者创建了选项对象并用默认值预填充它,然后调用用户的委托方法允许他们更改他们关心的设置。如果包作者想要更改默认值,他们会在自己的代码中这样做,发布一个新包,不更改该值的用户将获得新的默认值,而在其代码中明确设置该值的用户将继续使用他们想要的值,来自他们想要的任何配置存储。

所以,TL:DR 的答案是您不能用 PackageReference 项目做您要求的事情,但我希望我的长篇回答能让您了解如何重新设计您的库,从而更好地提供包作者和包用户更好的体验。