2009-11-06 3 views
19

Je souhaite inclure une partie dynamique dans le nom de fichier du fichier msi que mes projets wix produisent. Cette partie dynamique doit être contrôlée par des variables qui font partie de mon projet de Wix et déclarées comme ceci:WIX: Comment définir dynamiquement le nom du fichier de sortie msi

<?define ProductVersion="7.1.0.1" ?> 

Quelqu'un sait-il d'un moyen d'envoyer cette valeur de cette variable Wix à l'éditeur de liens pour l'utiliser comme une partie du nom de fichier de sortie?

Soit dit en passant: J'utilise Wix3

Répondre

2

Comme il est juste un nom de fichier, pourquoi ne pas avoir une action post-construction qui renomme le fichier dans votre script de compilation (en supposant MSBuild)?

+0

Ok, cela fonctionnerait probablement. Je vais essayer ça. Mais je cherchais un moyen plus direct - ou pensez-vous que ce n'est pas supporté par wix? J'ai lu quelque chose sur les variables de liens ici: http://n2.nabble.com/Types-of-variables-question-td3825142.html ! (Wix.Name) obtient ce qu'on appelle WixVariables (peut être défini dans le code source avec l'élément WixVariable, ou transmis sur la ligne de commande de la lumière et/ou allumé d'une manière similaire aux variables du préprocesseur sont passées à la bougie). Mais cela ne semble pas fonctionner. – Jan

+1

Je l'ai mentionné de cette façon, car c'est le moyen le plus rapide et le plus simple de le gérer. Comme tant d'autres problèmes de développement, souvenez-vous toujours de KISS. –

+5

Renommer le MSI est une mauvaise idée. Ne fais pas ça! http://blogs.msdn.com/b/robmen/archive/2004/12/08/278746.aspx – l33t

15

Le nom du fichier msi n'est pas déterminé par vos fichiers wix, mais par le commutateur light.exe -out. Vous pouvez utiliser la même valeur pour -out et à l'intérieur de vos fichiers Wix si vous effectuez les opérations suivantes dans votre script de construction, en supposant qu'il est un script batch:

  • définir une variable d'environnement avec set productversion=1.2.3
  • passe -out foo%productversion%.msi au light.exe éditeur de liens
  • utilisent la même variable d'environnement dans vos fichiers Wix comme $(env.productversion)
-5
Product Id="GUID" Name="whatevername $(var.ProductVersion)" 
+0

Ceci contrôle la façon dont le produit est affiché dans Ajout/Suppression de programmes, pas le nom de fichier du MSI. – Rozwel

0

Les variables doivent-elles être définies dans WiX? Je construis mes binaires d'installation à partir de MSBuild, et j'ai simplement défini le nom du fichier de sortie à MyProject_$(Platform) - Je m'attends à ce que toute substitution de variable MSBuild fonctionne aussi bien.

35

Vous pouvez mettre à jour le OutputName de votre fichier .wixproj et utiliser une variable MSBuild pour passer le numéro de version ou toute autre variable que vous aimez.

scénario

Mon construction ressemble à ceci:

set PRODUCTVERSION=7.1.0.1 
MSBuild.exe /p:Configuration=Debug /p:ProductVersion=%PRODUCTVERSION% Installer.wixproj 

Et mon projet WiX ressemble à ceci:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 
    <Platform Condition=" '$(Platform)' == '' ">x86</Platform> 
    <ProductVersion>1.0.0.0</ProductVersion> 
    <ProjectGuid>{b7415c44-8d59-4ac2-b698-03e399a305e3}</ProjectGuid> 
    <SchemaVersion>2.0</SchemaVersion> 
    <OutputName>Installer.$(ProductVersion)</OutputName> 
    ... 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> 
    <OutputPath>bin\$(Configuration)\</OutputPath> 
    <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath> 
    <DefineConstants>Debug</DefineConstants> 
    <WixVariables>ProductVersion=$(ProductVersion)</WixVariables> 
    </PropertyGroup> 
    ... 
</Project> 

La sortie serait:

Installer.7.1.0.1.msi 
+2

Je pense que c'est la meilleure réponse de tous par un mile .. – ostati

+1

Exactement ce que je cherchais, merci! Malheureusement VisualStudio ne semble pas aimer quelque chose comme ' $ (ProductName)' out of the box. Pour moi, il était suffisant de fournir une valeur par défaut (principalement utilisée pour les builds via VisualStudio par un humain: ' ApplicationSetup') et passer un Valeur réelle telle que décrite par @Charlie (lorsqu'elle est exécutée par le serveur de construction via msbuild). – CodeFox

+1

Cela devrait être la réponse acceptée ... était précisément ce dont j'avais besoin (plus l'addenda de @CodeFox). – Jon

0

Si vous avez plusieurs configuration que dans le fichier .wixprj vous pouvez faire ce qui suit

<OutputName Condition="'$(Configuration)' == 'User'">User.Setup</OutputName> 
<OutputName Condition="'$(Configuration)' == 'Designer'">Designerr.Setup</OutputName> 
1

J'ai trouvé quelques grands messages de référence pour faire juste cette opération:

http://blog.tentaclesoftware.com/archive/2009/05/03/38.aspx

et un suivi avec une meilleure méthode de création du fichier de sortie en utilisant un événement pré-construction:

http://blog.tentaclesoftware.com/archive/2010/08/05/99.aspx

Je sais les liens sont vieux, mais la méthode est son.

Voici les étapes de base:

  • Mettez la version que vous souhaitez utiliser dans un fichier que vous pouvez accéder à partir de votre projet. J'utilise l'exécutable principal de mon installation car je me lie aussi à cette version dans mes wxs. Dans mon cas, étant donné que je construis avec C# et que j'utilise SVN, j'ai une version modèle de mon assembly.cs, assembly.cs.txt, que j'exécute subwcrev en tant qu'événement de pré-construction pour créer le assembly.cs qui obtient compilé dans mon exécutable (je le fais en fait dans un projet séparé dans ma solution). Subwcrev insère des informations de date et de révision que j'utilise pour créer une version sous la forme "major.minor.version.0" où j'utilise "year.month.revision.0" pour ma version. Maintenant, je règle simplement AssemblyFileVersion avec cette méthode, mais pour pouvoir utiliser mon numéro de version dans l'événement wixproj build référencé dans le post ci-dessus, je dois également définir AssemblyVersion car c'est ce qui est accessible avec GetAssemblyIdentity. Cette méthode serait discutable si j'utilisais vraiment un assembly auquel quelqu'un d'autre est lié, mais pour moi c'est OK car c'est dans mon application finale exécutable. Suivez les étapes décrites dans la deuxième publication (le premier article traite de l'utilisation de la méthode de liaison pour la version dans wxs et du déchargement et de l'édition du contexte wixproj - valeur pour le deuxième article).

Fonctionne comme un charme!

Questions connexes