Nuget XDT Transform не работает для конфигурационных файлов
Я имею .NetStandard
библиотека. Я собираюсь использовать его в .NetFramework
а также .NetCoreApp
Приложения.
Оно использует System.Configuration.ConfigurationManager
пакет для работы с конфигурационными файлами. Мне нужно преобразовать эти файлы конфигурации во время установки моей библиотеки.
Я нашел 2 способа:
tools
папка в пакете nuget сinstall.ps1
файл в нем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
? Что я делаю не так?
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;
});
Это имеет некоторые преимущества для ваших пользователей.
- Они больше не ограничиваются хранением значения конфигурации в том месте, которое требовал автор библиотеки. Они могут выбрать загрузку конфигурации из базы данных, службы конфигурации, XML-файла, JSON-файла или просто жестко запрограммировать ее в приложении. Но это позволяет каждому разработчику выбирать, что лучше для их собственной системы.
- Если пользователь переопределяет параметр, который пакет помещает в файл конфигурации, и каждое обновление пакета переопределяет предпочтения пользователя, он раздражается, что пакет не учитывает свой выбор изменить значение по умолчанию.
- Если пользователь не хочет переопределять параметр, который пакет помещает в файл конфигурации, и автор пакета не хочет перезаписывать файл конфигурации при каждом обновлении, то автору пакета очень трудно изменить значение по умолчанию.
Новая модель ASP.NET Core лучше для всех, потому что автор пакета создает объект параметров и предварительно заполняет его значениями по умолчанию, а затем вызывает метод делегата пользователя, позволяющий им изменять настройки, которые им нужны. Если автор пакета хочет изменить значение по умолчанию, он делает это в своем собственном коде, публикует новый пакет, и пользователи, которые не изменяют значение, получают новое значение по умолчанию, а пользователи, которые явно устанавливают значение в своем коде, продолжают использовать значение, которое они хотят, из любого хранилища конфигурации, которое они хотят.
Таким образом, ответ TL:DR заключается в том, что вы не можете делать то, о чем просили в проектах PackageReference, но я надеюсь, что мой более длинный ответ дал вам идеи о том, как вы можете изменить дизайн своей библиотеки, что улучшит как автора пакета, так и пользователя пакета лучше опыт.