Pregunta Pasar parámetros de compilación al archivo .wxs para crear instaladores de wix dinámicamente


Soy un desarrollador estudiantil y he creado varios instaladores para la empresa con la que estoy trabajando ahora. Así que estoy bastante familiarizado con WIX. Recientemente decidimos tener un servidor de compilación que construye automáticamente nuestra solución. Construye depuración y liberación, así como proyectos ofuscados (y no ofuscados). Y realmente no tienes que entender nada de esto. Todo lo que tienes que entender es que tengo el mismo proyecto Wix que construye diferentes MSI dinámicamente. Entonces, la forma en que los construimos es que llamamos a MSBuild.exe con varios parámetros. Los parámetros del proyecto wix dependen de.

Entonces, digamos que vamos al prompt de comando y escribimos

C:\>\windows\Microsoft.NET\Framework\v3.5\MSBuild.exe MyApp.Install\MyApp.Install.wixproj /p:Configuration=Release /p:SpecialPath=Obfuscated /t:Build

La idea es que wix vea que el parámetro "SpecialPath" está asignado como "Ofuscado"; y en las rutas de instalación es su origen ..\myApp\bin\$(var.SpecialPath)\myApp.exe que se traduce a ..\myApp\bin\Obfuscated\myApp.exe cuando fue construido

La pregunta

¿Cómo se crean esos parámetros de compilación personalizados y los pasan a mi archivo .wxs? A partir de ahora con esta preparar, $(var.SpecialPath) no está definido y la construcción CrashSplosions.

Por obvias razones legales tuve que cortar el 90% del archivo project.wxs y cambiar el nombre de algunas cosas, pero para todos los efectos, esto es lo que tengo.

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="myApp" Language="1033" Version="$(var.Version)" Manufacturer="myApp" UpgradeCode="$(var.UpgradeCode)">
<Package Id="*" InstallerVersion="200" Compressed="yes" />
<Media Id="1" Cabinet="media.cab" EmbedCab="yes" />

<Directory Id="TARGETDIR" Name="SourceDir" >
  <Directory Id="ProgramFilesFolder">
    <Directory Id="INSTALLLOCATION" Name="myApp"> 

      <Component Id="myAppEXE" Guid="FD5EBC02-MY29-GUID-ACCA-61324C5F1B68">
        <RegistryKey Root="HKLM" Key="Software\MyApp">
          <RegistryValue Value="0" Type="string" KeyPath="yes"/>
        </RegistryKey>
        <File Id="MYAPPEXE" Name='myApp.exe' Source="..\myApp\bin\$(var.SpecialPath)\myApp.exe" />
      </Component>

      <Component Id="EngineDLL" Guid="*">
        <File Id="ENGINEDLL" Name='Engine.dll' Source="..\myApp\bin\$(var.Configuration)\Engine.dll" />
      </Component>
      <Component Id="CommonDLL" Guid="*">
        <File Id="COMMONDLL" Name='Common.dll' Source="..\myApp\bin\$(var.Configuration)\Common.dll" />
      </Component>

    </Directory>
  </Directory>
</Directory>

<Feature Id="ProductFeature" Title="myApp" Description='All' Display='expand' Level="1" ConfigurableDirectory='INSTALLLOCATION'>
  <ComponentRef Id="myAppEXE" />
  <ComponentRef Id="EngineDLL" />
  <ComponentRef Id="CommonDLL" />
</Feature>
</Product>
</Wix>

11
2018-01-06 21:45


origen


Respuestas:


Como ya se respondió, debe pasar las variables a WiX. Utilizamos Nant en lugar de MSBuild, pero el concepto sigue siendo el mismo.

Aquí hay un ejemplo de Nant que pasa en media docena de variables a la vela (no es el ejemplo más limpio, sino que se levanta al pie de la letra de un proyecto en el que trabajé)

<candle   out="${dir.obj}\"
          rebuild="true"
          extensions="WixUIExtension;WixNetFxExtension">
    <defines>
        <define name="ProcessorArchitecture" value="${release.platform}" />
        <define name="SourceDir" value="${dir.source}" />
        <define name="version" value="${version}" />
        <define name="releasetype" value="${release.type}" />
        <define name="Language" value="${language}" />
        <define name="product" value="${string.product}" />
        <define name="productedition" value="${release.productedition}" />
    </defines>

    <sources>
        <include name="*.wxs" />
        <include name="..\Common\*.wxs" />
    </sources>
</candle>

<!-- Define fallback culture for non-US -->
<property name="cultures" value="${language}" />
<property name="cultures" value="${language};en-US" unless="${language == 'en-US'}" />

<light
  out="${dir.build}\setup_${release.platform}_${release.compressionlevel}.msi"
  extensions="WixUIExtension;WixNetFxExtension;WixUtilExtension"
  cultures="${cultures}"
  rebuild="true"
  suppressices="ICE03;ICE82"
  suppresspdb="true" >


    <arg line="-loc &quot;setup-${language}.wxl&quot;" />
    <arg line="-sw1101" />

    <arg line="-b ${dir.resources}" />
    <arg line="-b ${dir.resources.common}" />
    <arg line="-b ${dir.resources.common}\Microsoft" />
    <arg line="-b ${dir.source}" />
    <arg line="-dcl:${release.compressionlevel}" />
    <arg line="-dWixUILicenseRtf=EULA_${language}.rtf" />
    <sources>
        <include name="${dir.obj}\*.wixobj" />
    </sources>
</light>

3
2018-01-07 00:27



La razón por la que no le funciona es porque está configurando propiedades de msbuild en la línea de comandos, que no se pasan como variables wix. Las propiedades de MSBuild y wix son dos conceptos diferentes.

Una forma de solucionar esto es ignorar el concepto de propiedades de msbuild y usar variables de entorno para pasar valores directamente a candle.exe. Puede usar variables de entorno en su archivo wxs de esta manera:

$(env.SpecialPath)

A continuación, puede iniciar su compilación de instalación desde un archivo por lotes que prepara las variables de entorno necesarias como esta:

@echo off
setlocal

set SpecialPath=foo
set Configuration=Release
set msbuild=C:\windows\Microsoft.NET\Framework\v3.5\MSBuild.exe

%msbuild% test.wixproj /t:Build || goto ERROR

exit /b 0

:ERROR
echo Failed to build setup!
exit /b 1

Alternativamente, si prefiere pasar parámetros a través de las propiedades de msbuild, primero debe echar un vistazo al tarea de velas msbuild documentación. Muestra que puedes establecer valores en tu archivo wixproj de esta manera:

<DefineConstants>Variable1=value1;Variable2=value2</DefineConstants>

Sin embargo, esto todavía requiere que codifique valores en el archivo wixproj. Si desea pasar los valores como propiedades de msbuild en la línea de comando, entonces probablemente deba hacer algo como esto:

<DefineConstants>Variable1=$(value1);Variable2=$(value2)</DefineConstants>

y luego pasar /p:value1=foo /p:value2=bar en la línea de comandos, o define estas propiedades msbuild en otro lugar.


16
2018-01-06 22:54



Tuve una situación similar en la que la ruta de origen de los archivos debía pasarse como un argumento de línea de comando al script de compilación. Esto es lo que hice: Editó el archivo wixproj y agregó el siguiente contenido bajo el nodo "PropertyGroup":

<Source Condition=" '$(Source)' == '' ">R:</Source>

donde R: es el directorio / ruta predeterminado desde donde se elige la fuente. Ahora, la fuente también se puede pasar como un argumento de línea de comando durante la compilación:

msbuild /t:Clean,Build "MyPath\MyWixProject.wixproj" /property:Source=MyConfigurablePath /p:Configuration=Release

0
2018-02-26 09:51