0

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

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

我找到了两种方法:

  1. toolsnuget 包中的文件夹,其中包含install.ps1文件
  2. contentapp.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? 我做错了什么?

4

1 回答 1

0

执行 ps1 脚本和 XDT 转换都是仅适用于 packages.config而非 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 项目做你所要求的,但我希望我更长的答案能给你一些想法,你可以如何重新设计你的库,从而更好地为包作者和包用户提供更好的经验。

于 2018-12-07T04:38:48.977 回答