web-dev-qa-db-fra.com

Wix- Comment copier un répertoire pour installer le dossier

J'ai un dossier Bin avec de nombreux fichiers dans mon projet. Pour l'instant, je sais seulement comment ajouter des fichiers spécifiques au dossier d'installation avec le code ci-dessous.

<File Source='$(var.Debug)Myapplication.exe' Id='file4028276A0CAD84E3BDE449237AE31A5F' />  

Cependant, je veux déplacer un répertoire entier vers le chemin d'installation. Par exemple, déplacez le dossier entier "Bin" vers le chemin d'installation "C:\Myapplication".

Que dois-je faire alors?

Merci d'avance!

20
Jack He

comment inclure une grande arborescence de répertoires dans un programme d'installation de wix

Cela semble bon. Mais trop de travail à faire.

Comment copier un dossier sous Wix

Le lien ci-dessus a bien fonctionné. Mais ne peut pas copier les sous-dossiers.

Donc, ce que j'ai fait, j'ai créé une application qui lit tout le dossier et obtient ses sous-répertoires et fichiers et génère les blocs de code nécessaires comme

 <Component Id="myfile" Guid="GUID">
     <File Id="myfile.txt" Source="MySourceFiles\myfile.txt" KeyPath="yes" Checksum="yes"/>
 </Component>

Ensuite, j'ai ajouté le bloc de code généré au fichier .wxs.

Le temps initial que vous passez pour créer cette application n'est pas un gaspillage. Parce que vous pouvez continuer à l'utiliser pour toujours. Je vous recommande de copier fichier par fichier, car cela est utile lors d'une mise à niveau ou d'une réparation. MSI conserve un enregistrement pour chaque fichier à copier. Il est donc maintenable et utile pour les mises à niveau et les réparations.

3
LeoN

On dirait que ce que vous voulez utiliser est l'outil WiX heat, qui est utilisé pour "récolter" un répertoire (ou des fichiers individuels) et créer un fichier fragment WiX que vous pouvez utiliser dans votre projet.

Par exemple, vous avez un répertoire que vous souhaitez récolter, et il peut inclure des sous-répertoires, mais il y a beaucoup de fichiers, et vous voulez tout ... la chaleur le fera pour vous.

Considérez cette structure triviale:

Somedir
    |
    |---A file.txt
    |---An init file.ini
    |---another file.txt
    |---subfolder
            |
            |---a subfolder file.txt

Si vous utilisez la chaleur pour récolter ce répertoire, l'outil génère pour vous le fichier de fragment que vous pouvez utiliser comme référence de composant dans votre projet sans avoir à spécifier les fichiers un par un ou utiliser une solution de contournement.

Par exemple, la commande heat suivante traitera ce répertoire (à partir d'un niveau dans cet exemple)

heat dir somedir -o MyHarvestedStuff.wxs -scom -frag -srd -sreg -gg -cg MyComponentGroupId -dr BIN_DIR_REF

Où:

dir = harvest a directory
somedir = directory you want to harvest
-o MyHarvestedStuff.wxs = the output fragment file
-scom -sfrag -srd -sreg = Suppress COM elements, fragments, root directory as element, registry harvesting (these options will create a grouping that most applications can use)
-gg = generate GUID's now (this will put the GUID's into your output file, rather than using a wildcard "*". The advantage here is you can use non-standard TARGETDIR, which would not qualify for autogenerated GUID's)
-cg MyComponentGroupId = component group. this is what you will use in your feature set to include these files
-dr BIN_DIR_REF = this is the directory reference for which to place the files in your final package.

Le XML résultant ressemble à ceci (cela a été exécuté sans -gg pour éviter de publier de vrais GUID)

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.Microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="BIN_DIR_REF">
            <Directory Id="dirF065D7446868E03DB0B296EBADA4E4A1" Name="subfolder" />
        </DirectoryRef>
    </Fragment>
    <Fragment>
        <ComponentGroup Id="MyComponentGroupId">
            <Component Id="cmp739547000B47E975B0452D876AF7810B" Directory="BIN_DIR_REF" Guid="PUT-GUID-HERE">
                <File Id="fil09B311A6D1EABD9E94DFA5C83F59C548" KeyPath="yes" Source="SourceDir\A file.txt" />
            </Component>
            <Component Id="cmp84C8400F892D39B05EE3021CCEEAA14F" Directory="BIN_DIR_REF" Guid="PUT-GUID-HERE">
                <File Id="fil11A22646343997D26AC54171A62DFF4C" KeyPath="yes" Source="SourceDir\an init file.ini" />
            </Component>
            <Component Id="cmpFA266FC6F3269CB5D9E42C38FC995117" Directory="BIN_DIR_REF" Guid="PUT-GUID-HERE">
                <File Id="filA545B6E4B63B8211E982917FC78F6EB4" KeyPath="yes" Source="SourceDir\another file.txt" />
            </Component>
            <Component Id="cmp2EC5C1618A59F47B7BDE800EB9AA8688" Directory="dirF065D7446868E03DB0B296EBADA4E4A1" Guid="PUT-GUID-HERE">
                <File Id="filB0CD0B02385137DC806112E293083459" KeyPath="yes" Source="SourceDir\subfolder\a subfolder file.txt" />
            </Component>
        </ComponentGroup>
    </Fragment>
</Wix>

Dans votre fichier de projet, vous auriez quelque chose comme ça sous votre racine <Directory> élément:

<Directory Id="BIN_DIR_REF" Name="bin">
    <!-- anything else you might put here...-->
</Directory>

Et dans votre groupe de fonctionnalités:

<Feature Id="Complete" Level="1">
    ...
    <ComponentGroupRef Id="MyComponentGroupId" />         
    ...
</Feature>

Lier le tout ensemble ...

  1. Fournissez votre nouveau fichier de fragment à candle avec vos autres fichiers
  2. Fournissez le fichier .wixobj que candle produit à light
  3. Résolvez la référence SourceDir dans votre nouveau fichier de fragment avec une variable de préprocesseur WiX ou avec le -b option pour light

    Ex: light ... -b "path to my directory that I harvested" ...

Ne laissez pas la longueur de la réponse vous dissuader d'explorer cette solution, cela fonctionne assez bien et c'est assez simple. Maintenant, si vous voulez exclure quoi que ce soit de ce répertoire, c'est entier autre histoire ...

67
Ryan J