Как указать расположение вставки для узла в конфигурации 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])" />

Надеюсь это поможет.

Другие вопросы по тегам