Estoy usando Wix 3.6 beta desde la línea de comandos, no como proyectos VS. Tengo una aplicación web que se cosecha con calor como un directorio. Esto funciona. Estoy usando las transformaciones web.config para administrar cada uno de los archivos web.config del entorno de destino. Estos se generan con msbuild, esto funciona y mantiene las cosas visibles en Visual Studio y control de fuente.Usando Wix, ¿cómo puedo implementar uno de varios archivos web.config mientras instalo una aplicación web ASP.net
He tenido un problema al implementar uno de los varios archivos web.config que incluyo manualmente en product.wxs como componentes con condiciones. Esperaba incluir todos los componentes como funciones desplegables y dejar que las condiciones seleccionaran solo una como activa. Por ejemplo:
<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>
Esto no crea ningún cambio de nombre de archivo, mover o eliminar los problemas, pero tiene el problema muy fundamental que múltiples archivos web.config se asignan al mismo destino y esto me da un error de luz de "Product.wxs (xxx): error LGHT0091: Símbolo duplicado 'Archivo: web.config' encontrado. Esto normalmente significa que se ha duplicado un Id. Compruebe para asegurarse de que todos sus identificadores de un tipo determinado (Archivo, Componente, Característica) son únicos."
Un enfoque alternativo fue utilizar diferentes archivos con el nombre .config y renombrar/mover uno a ser el web.config, así que algo como:
<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>
Esto no arroja un error, el bot CopyFile comando no hace nada en absoluto. Acabo de obtener setup_a.config en la carpeta wwwroot.
Si el nido CopyFile dentro del archivo, la acción de copiar a continuación funciona:
<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>
... pero CopyFile anidada significa que no puedo añadir (que ha anulado) Eliminar el atributo = "sí" a crear una acción 'mover'. En cambio, me quedan tanto setup_a.config como web.config en la carpeta wwwroot. Alternativamente, si añado un RemoveFile separada dentro del mismo elemento componente que también no hace nada:
<RemoveFile Id="removefile" On="install" Directory="wwwroot" Name="setup_a.config"/>
</Component>
lo tanto, estoy esperando un ejemplo de trabajo de cómo manejar múltiples archivos web.config en un despliegue condicional, eso no deja archivos atrás. el nombre de archivo de destino de web.config lo fija el marco y no se puede cambiar. Las diferentes configuraciones también se generan previamente fuera de wix usando config transforma, esto tampoco se puede cambiar, pero los nombres de archivos generados podrían ser cualquier cosa.
¡salud!
Ahhhh la falta de un atributo de nombre estaba estropeando mis elementos de archivo, haciéndome pensar que esto no iba a funcionar. Tu ejemplo funcionó, gracias Yan. –
Lo hago un poco más limpio (evite las advertencias de validación ICE). Autorizo los componentes/archivos como web.config-a y web.config y luego uso un elemento CopyFile para clonarlo en web.config. HIELO agradable y limpio. Downside es un archivo extra en la caja. Upside es el archivo que me da una pista visual de qué elección se hizo y una copia de los archivos vírgenes en caso de que alguien modifique el archivo web.config y yo quiera comparar/revertir. –