web-dev-qa-db-fra.com

Inclure tous les fichiers dans le dossier Bin dans le programme d'installation de Wix

Je suis nouveau dans Wix, je crée avec succès un programme d'installation MSI pour mon projet, mais mon dossier Bin contient beaucoup de fichiers DLL avec le fichier principal EXE, je veux inclure tous ces fichiers avec le programme d'installation

J'ai trouvé CETTE solution, cela semble juste mais malheureusement je ne peux pas accomplir cette solution dans mon fichier Wix, voici mon fichier Wix:

<Product Id="*" Name="Setup"
       Language="1033" Version="1.0.1.0"
       Manufacturer="ORDER MS"
       UpgradeCode="a4f0a0d0-ae64-4f62-9bb3-efa7e75072e0">

<Package InstallerVersion="200"
         Compressed="yes"
         InstallScope="perMachine" />

<MajorUpgrade Schedule="afterInstallInitialize"
              DowngradeErrorMessage="A newer version of [ProductName] is already installed." />

<MediaTemplate />

<Feature Id="ProductFeature" Title="Setup" Level="1">
  <ComponentGroupRef Id="ProductComponents" />
  <ComponentRef Id="ApplicationShortcutDesktop" />
  <ComponentRef Id="ApplicationShortcut" />
</Feature>

<Icon Id="Icon.exe" SourceFile="$(sys.CURRENTDIR)\icon.ico"/>
<Property Id="ARPPRODUCTICON" Value="icon.exe" />



<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
  <Component Id="ProductComponent">
    <File Source="$(var.Order.TargetPath)" />
  </Component>

  <Component Guid="A7C42303-1D77-4C70-8D5C-0FD0F9158EB4" Id="CopyComponent">
    <CopyFile Id="SomeId" 
              SourceProperty="SOURCEDIRECTORY"
              DestinationDirectory="CopyTestDir" SourceName="*" />
  </Component>    
</ComponentGroup>

Je reçois cette erreur:

Erreur 1 ICE18: KeyPath pour le composant: "CopyComponent" est le répertoire: "INSTALLFOLDER". La paire répertoire/composant doit être répertoriée dans le tableau CreateFolders.

11

Cette solution fonctionne avec WIX 3.11.

Pour récolter un répertoire entier, vous pouvez utiliser Heat à partir du jeu d'outils WIX. Avec Heat, nous pouvons inclure automatiquement tous les fichiers d'un répertoire source donné sur chaque build. Pour ce faire, nous devons d'abord modifier le Setup.wixproj:

Définissez le chemin de récolte de la chaleur:

<PropertyGroup>    
  <DefineConstants>HarvestPath=...\Deploy</DefineConstants>
</PropertyGroup>

La chaleur créera un .wxs fichier. Nous devons donc ajouter ce fichier à la compilation ItemGroup:

<ItemGroup>
  <Compile Include="Product.wxs" /> <!-- This will be your default one -->
  <Compile Include="HeatGeneratedFileList.wxs" /> <!-- This is the Heat created one -->
</ItemGroup>

Exécutez ensuite Heat dans la cible de génération BeforeBuild:

<Target Name="BeforeBuild">
  <HeatDirectory Directory="..\Deploy" 
    PreprocessorVariable="var.HarvestPath" 
    OutputFile="HeatGeneratedFileList.wxs" 
    ComponentGroupName="HeatGenerated" 
    DirectoryRefId="INSTALLFOLDER" 
    AutogenerateGuids="true" 
    ToolPath="$(WixToolPath)" 
    SuppressFragments="true" 
    SuppressRegistry="true" 
    SuppressRootDirectory="true" />  
</Target>

Cela générera le HeatGeneratedFileList.wxs chaque fois que le programme d'installation de WIX est construit. Le répertoire ..\Deploy doit être défini dans le répertoire des fichiers à inclure. La seule chose que nous devons faire pour inclure ces fichiers dans notre programme d'installation est de modifier le fichier .wxs fichier (comme Product.wxs dans cet exemple). Heat créera un ComponentGroup avec le nom donné ci-dessus. Ce composant doit être référencé dans la section Fonctionnalité du Product.wxs:

<Feature Id="ProductFeature" Title="DiBA Tool" Level="1">
  <...>
  <ComponentGroupRef Id="HeatGenerated" />
</Feature>
29
darkend

Je fais quelque chose de similaire à ce dont vous avez besoin ici lors de mon installation. J'ai besoin de copier le contenu d'un dossier contenant plus de 1000 fichiers (les fichiers d'aide).

Ce que j'ai fait pour résoudre ce problème est le suivant:

Dans le fichier Installer.wixproj, j'ai défini les éléments suivants:

<Target Name="BeforeBuild" >
    <Exec Command="&quot;$(WixToolPath)Heat.exe&quot; dir &quot;$(MSBuildThisFileDirectory)\$(Configuration)\bin&quot; -ag -cg BinDir -dr BIN -template fragment -sreg -sfrag -srd -var var.BinDir -o &quot;$(MSBuildThisFileDirectory)\Components\Bin.wxs&quot;" Condition="!Exists('$(MSBuildThisFileDirectory)\Components\Bin.wxs')" />
</Target>

Et cela va chauffer le $ (Configuration)\bin\dir et générer un fichier wxs comprenant TOUS les fichiers dans le répertoire bin.

De cette façon, si vous ajoutez ou supprimez des fichiers binaires dans votre répertoire bin, ils seront automatiquement récupérés lorsque vous reconstruisez votre programme d'installation (si le fichier Bin.wxs n'existe pas).

Maintenant, vous devez vous assurer que vous définissez la variable "BinDir" pour wix qui pointe vers le répertoire bin sur la machine de génération. Vous devez également ajouter le fichier Bin.wxs à votre wixproj en tant que lien (lors de l'ajout d'un fichier existant, il y a une petite flèche déroulante sur "Ajouter". Cliquez dessus et sélectionnez "Ajouter en tant que lien".)

Je pense qu'il y a un objectif de chaleur réel quelque part dans Wix, mais je n'ai pas suffisamment examiné cela pour savoir comment l'utiliser.

4
Brian Sutherland

Je pense que vous vous êtes un peu embrouillé, si cela ne vous dérange pas de le dire.

CopyFile copiera un fichier copiera un fichier d'un endroit sur une machine cible (la machine où l'installation est installée, pas votre ordinateur de développement) vers un autre dossier sur la même machine. Je ne pense pas que c'est ce que vous voulez.

Comme Brian l'a suggéré, vous pouvez utiliser Heat pour analyser un dossier et générer du code pour vous. Vous pouvez utiliser cela de deux manières:

Comme aide au développement

Exécutez l'outil avec ce type de commande:

heat dir ".\My Files" -gg -sfrag -template:fragment -out directory.wxs

Ensuite, prenez directory.wxs et utilisez-le comme code source.

Dans le pipeline de construction

Vous pouvez utiliser l'outil Heat dans le pipeline de génération, de sorte que la compilation de l'installation génère le code.

Contrairement à la suggestion de Brian, si vous utilisez MSBuild, je suggère la cible HarvestDirectory . Voici ce que j'ai là où je fais quelque chose de similaire:

<HarvestDirectory Include="$(MyHarvestDirectory)">
  <InProject>false</InProject>
  <PreprocessorVariable>var.MyHarvestDirectory</PreprocessorVariable>
  <ComponentGroupName>MyComponentGroup</ComponentGroupName>
  <DirectoryRefID>MY_DIRECTORY_ID</DirectoryRefID>
</HarvestDirectory>

Cela alimentera un élément dans la cible HarvestDirectory et s'assurera que tout est géré de la bonne manière. Ce code va juste dans un ItemGroup dans votre .wixproj. (Si vous ne savez pas comment modifier votre fichier de projet, consultez cette vidéo )

Bien sûr, cela suppose que vous utilisez MSBuild (ou Visual Studio, car cela utilise MSBuild).

Caveat

Cela dit, si le problème principal est simplement qu'il y a beaucoup de fichiers, je dirais simplement "knuckle down" et je définirai simplement la liste. Utilisez l'outil Heat comme échafaudage si vous le souhaitez, mais rien ne peut remplacer l'apprentissage de la langue et son utilisation. Essayer de faire des choses avec du code généré automatiquement peut introduire des problèmes subtils, et il est toujours plus simple de travailler avec une liste statique.

2
JohnL