Как указать расположение вставки для узла в конфигурации config xdt transform
У меня есть пакет nuget, который я пытаюсь создать, и я не могу понять, как заставить эту последнюю часть работать должным образом. Я использую преобразования config.install.xdt для добавления элементов конфигурации в файл конфигурации клиента.
Я просто добавляю новый <section>
узел в файл конфигурации клиента, как показано ниже:
<?xml version="1.0" ?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<configSections xdt:Transform="InsertIfMissing">
<section xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)"
name="myPackageName"
type="MyPackage.Config.MySection, MyPackage" />
</configSections>
</configuration>
Проблема в том, что <configSections>
должен быть первым потомком корня <configuration>
элемент в клиенте app.config. Если не существует <configSections>
в клиентском приложении вышеупомянутое преобразование просто добавляется <configSections>
как последний ребенок в <configuration>
,
Есть ли способ заставить <configSections>
быть вставленным как первый ребенок в <configuration>
?
Редактировать 1
Я хотел бы добавить некоторые детали относительно того, что я пробовал и с какими результатами...
Первое преобразование, с которым я пошел, было <configSections xdt:Transform="InsertIfMissing">
, Даже когда это первый дочерний элемент в моем файле config.install.xdt, он устанавливается в конец файла конфигурации клиента после установки.
Я пробовал несколько вариантов с преобразованиями InsertBefore и InsertAfter. К сожалению, я не могу просто использовать, например, <configSections xdt:Transform="InsertBefore(/configuration/appSettings)"
потому что элемент appSettings не всегда может существовать в файле конфигурации клиента, а также не может быть первым дочерним узлом.
Я думаю, что для этого должны быть некоторые функциональные возможности, поскольку при установке пакета nuget, такого как Entity Framework, в проект с файлом конфигурации, который еще не имеет <configSections>
узел, <configSections>
узел добавляется как первый дочерний элемент в пределах <configuration>
root с установкой Entity Framework.
Редактировать 2
После нескольких часов поисков и ударов головой о стену, благодаря ответу Лео, я нашел еще один пост, посвященный переполнению стека, с тем же вопросом. Я пометил свой вопрос как дубликат. Вот ссылка.
1 ответ
Как указать расположение вставки для узла в конфигурации config xdt transform
<configSections>
должен быть первым дочерним элементом корневого элемента в клиентском app.config при установке nuget в проект по умолчанию.
Так же, как вы знаете и как указано в документации:
Если этот элемент находится в файле конфигурации, он должен быть первым дочерним элементом элемента
Здесь вы указываете, какие разделы конфигурации будут в вашем app.config, следовательно, это должно быть в начале элемента конфигурации.
Итак <configSections>
должен быть первым дочерним элементом корневого элемента в клиентском app.config по умолчанию, даже если он не существует <configSections>
в клиентском приложении.
В качестве теста я создал простой тестовый пакет Nuget с content
папка, в том числе App.config.transform
а также Web.config.transform
, Скопируйте ваш код в содержимое .transform
:
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<configSections xdt:Transform="InsertIfMissing">
<section xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)"
name="myPackageName"
type="MyPackage.Config.MySection, MyPackage" />
</configSections>
</configuration>
Затем установите этот пакет nuget в тестовый проект:
Кроме того, вы можете попробовать использовать подстановочный знак *
вместо appSettings
когда вы используете преобразования InsertBefore
, лайк:
<configSections xdt:Transform="InsertBefore(/configuration/*[1])" />
Надеюсь это поможет.