【问题标题】:Nuget xdt transform does not work for config filesNuget xdt 转换不适用于配置文件
【发布时间】:2018-12-07 12:38:48
【问题描述】:

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

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

我找到了两种方法:

  1. nuget 包中的tools 文件夹,其中包含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有关吗?我做错了什么?

【问题讨论】:

    标签: nuget nuget-package .net-standard xdt-transform


    【解决方案1】:

    执行 ps1 脚本和 XDT 转换都是仅适用于 packages.config、but not PackageReference 的功能。 .NET Core(我认为是 .NET Standard)项目仅适用于 SDK 风格的项目,而 SDK 风格的项目仅支持 PackageReference。 Packages.config 仅适用于“旧式”项目,也可能是 PackageReference。

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-26
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 2013-10-15
      相关资源
      最近更新 更多