2011-12-22 16 views
5

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!

Respuesta

7

Lo complica demasiado. Esto debería funcionar: la atención

<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> 

atención a un par de cosas aquí:

  • Archivo/@ nombre es el mismo - que es el nombre del archivo de destino que le gustaría tener (web.config)
  • Archivo/@Id es diferente para cada archivo con el fin de evitar el error de luz se menciona por primera vez
  • Archivo/@ fuente puede ser cualquier cosa - sólo describe lo que el archivo de tomar como fuente

En esta luz de muestra seguirá quejándose con una advertencia LGHT1076, pero eso es solo una advertencia: le llama la atención que las condiciones DEBEN ser mutuamente exclusivas para evitar problemas.

+0

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. –

+1

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. –

2

Suelo adoptar un enfoque diferente. En lugar de colocar múltiples archivos mutuamente excluyentes en un instalador que están estrechamente relacionados con instancias específicas, coloco un archivo genérico en el instalador y uso los cambios XML para transformar el XML con los datos del punto de variación, como la cadena de conexión y lo que no.

Esto me permite crear instaladores que se pueden implementar en cualquier lugar de forma silenciosa solo con pasar algunas propiedades y la línea de comandos.

Cuestiones relacionadas