Используя 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: Обнаружен повторяющийся символ 'File:web.config'. Как правило, это означает, что Id дублирован. Проверьте, чтобы все ваши идентификаторы данного типа (File, Component, Feature) были уникальными."

Альтернативный подход состоял в том, чтобы использовать разные именованные файлы.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" для создания действия "move". Вместо этого я остаюсь с setup_a.config и web.config в папке wwwroot. В качестве альтернативы, если я добавлю отдельный файл удаления в тот же элемент компонента, он также ничего не сделает:

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

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

ура!

2 ответа

Решение

Вы слишком усложняете это. Это должно работать:

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

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

Обратите внимание на пару вещей здесь:

  • File/@Name - то же самое - это имя целевого файла, которое вы хотели бы иметь (web.config)
  • File/@Id отличается для каждого файла, чтобы избежать легкой ошибки, которую вы упомянули первой
  • Файл /@Source может быть чем угодно - он просто описывает, какой файл взять в качестве источника

В этом примере индикатор будет по-прежнему жаловаться на предупреждение LGHT1076, но это всего лишь предупреждение - оно обращает ваше внимание на то, что условия ДОЛЖНЫ быть взаимоисключающими, чтобы избежать проблем.

Я обычно придерживаюсь другого подхода. Вместо того, чтобы помещать несколько взаимоисключающих файлов в установщик, которые тесно связаны с конкретными экземплярами, я помещаю общий файл в установщик и использую XML-изменения для преобразования XML с данными точки вариации, такими как строка соединения и что нет.

Это позволяет мне создавать установщики, которые могут быть развернуты в любом месте без вывода сообщений, просто передав несколько свойств и командную строку.

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