2013-08-13 5 views
3

Я пытаюсь создать установщик web.config для моего пакета NuGet с использованием XDT Transforms.Как обрабатывать глубокие преобразования XDT, когда структура целевого файла конфигурации неизвестна?

Я хочу, чтобы преобразовать файл web.config:

<configuration> 
    <system.web> 
    </system.web> 
</configuration> 

, чтобы выглядеть следующим образом:

<configuration> 
    <system.web> 
     <httpHandlers> 
      <add path="*." verb="*" type="CustomHandler" /> 
     </httpHandlers> 
    </system.web> 
</configuration> 

Вот являются прообразы я пытался:

Transform # 1:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> 
    <system.web> 
     <httpHandlers> 
      <add path="*." verb="*" type="CustomHandler" xdt:Transform="Insert" /> 
     </httpHandlers> 
    </system.web> 
</configuration> 

Это работает, только если целевой web.config уже содержит раздел <httpHandlers />.

В приведенном выше примере (примечание, нет <httpHandlers /> раздел), это приводит к ошибке:

No element in the source document matches '/configuration/system.web/httpHandlers/add'

Transform # 2:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> 
    <system.web> 
     <httpHandlers xdt:Transform="Insert"> 
      <add path="*." verb="*" type="CustomHandler" /> 
     </httpHandlers> 
    </system.web> 
</configuration> 

Это работает, как ожидается, в выше, но, учитывая файл web.config с уже существующим разделом <httpHandlers />, этот раздел дублируется.

Помните, что это для пакета NuGet, и я не могу сделать предположения о состоянии конфигурации пользователя.

Я новичок в XDT Transforms, поэтому, возможно, пропустил что-то очевидное.

ответ

3

Похож на this will do the trick.

Новое в VS2012, xdt:Transform="InsertIfMissing".

+0

Удивительный! Спасибо, Нейл. –

+0

К сожалению, нет соответствующего xdt: Transform = "RemoveIfEmpty", чтобы сделать обратное. –

+0

Ну, они открыли с открытым исходным кодом ... Вы можете написать свой собственный! http://xdt.codeplex.com/ – NeilD