Преобразование Nuget xdt не работает для файлов конфигурации

У меня есть .NetStandard библиотека. Я собираюсь использовать его в .NetFramework и .NetCoreApp приложениях.

Для работы с конфигурационными файлами используется пакет System.Configuration.ConfigurationManager. Мне нужно преобразовать эти файлы конфигурации во время установки моей библиотеки.

Нашел 2 способа:

  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? Что я делаю не так?


person Boris Maslennikov    schedule 05.12.2018    source источник


Ответы (1)


Выполнение сценариев 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, но я надеюсь, что мой более длинный ответ дал вам идеи, как вы можете переделать свою библиотеку, которая дает лучше как автору пакета, так и пользователю пакета опыт.

person zivkan    schedule 07.12.2018