Использование Wix, как развернуть один из нескольких файлов web.config при установке веб-приложения ASP.net

Я использую бета-версию Wix 3.6 из командной строки, а не как проекты VS. У меня есть веб-приложение, которое собрано с теплом в качестве каталога. Это работает. Я использую преобразования web.config для управления каждым из файлов web.config целевой среды. Они выводятся с помощью msbuild, это работает и сохраняет видимость в Visual Studio и системе управления версиями.

У меня возникла проблема при развертывании одного из нескольких файлов web.config, которые я вручную включаю в product.wxs как компоненты с условиями. Я ожидал включить все компоненты в качестве развертываемых функций и позволить условиям выбрать только один в качестве активного. Например:

        <DirectoryRef Id="wwwroot">
        <Component Id="setup_a" Guid="some_guid" >
            <File Source="$(var.ConfigSourceDir)\setup_a\web.config"  />
            <Condition>ENVIRON = setup_a</Condition>
        </Component>

        <Component Id="setup_b" Guid="some_guid" >
            <File Source="$(var.ConfigSourceDir)\setup_b\web.config" />
            <Condition>ENVIRON = setup_b</Condition>
        </Component>

Это не привело к возникновению каких-либо проблем с переименованием, перемещением или удалением файлов, но возникла очень фундаментальная проблема, заключающаяся в том, что несколько файлов web.config сопоставляются с одним и тем же местом назначения, и это дает мне небольшую ошибку " Product.wxs (xxx): ошибка LGHT0091: обнаружен повторяющийся символ "Файл: web.config". Обычно это означает, что дублируется идентификатор. Убедитесь, что все идентификаторы данного типа (файл, компонент, функция) уникальны. . "

Альтернативный подход заключался в использовании файлов .config с разными именами и переименовании / перемещении одного из них в web.config, что-то вроде:

        <DirectoryRef Id="wwwroot">
                <Component Id="setup_a" Guid="some_guid" >
                <File Id="setup_a.config" Source="$(var.ConfigSourceDir)\setup_a.config"  />
                <CopyFile Id="moveit" SourceDirectory="wwwroot" SourceName="setup_a.config" DestinationDirectory="wwwroot" DestinationName="web.config"  />
               </Component>

Это не вызывает ошибки, бот команда CopyFile ничего не делает в все. Я просто получаю setup_a.config в папке wwwroot.

Если я вложу CopyFile в файл, действие копирования будет работать:

        <DirectoryRef Id="wwwroot">
               <Component Id="setup_a" Guid="some_guid" >
               <File Id="setup_a.config" Source="$(var.ConfigSourceDir)\setup_a.config"  >
                    <CopyFile Id="moveit" DestinationName="web.config"/>
               </File>
               </Component>

... но вложенный CopyFile означает, что я не могу добавить (он запрещен) атрибут Delete = "yes" для создания 'перемещения' действие. Вместо этого у меня остались и setup_a.config, и web.config в папке wwwroot. В качестве альтернативы, если я добавлю отдельный файл удаления в один и тот же элемент компонента, он также ничего не сделает:

<RemoveFile Id="removefile" On="install" Directory="wwwroot" Name="setup_a.config"/>
</Component>

Итак, я надеюсь получить рабочий пример того, как обрабатывать несколько файлов web.config в условном развертывании, это не оставляет файлов. имя файла назначения web.config фиксируется платформой и не может быть изменено. Различные конфигурации также предварительно генерируются вне wix с использованием преобразований конфигурации, это также нельзя изменить, но сгенерированные имена файлов могут быть любыми.

ура!

5
задан Paul George 22 December 2011 в 11:57
поделиться