2010-01-25 10 views
18

Jestem nowy w WiX. Bardzo nowy. Czy istnieje sposób, aby zdefiniować jednocześnie ComponentGroup i Directory?W Wix, czy można zdefiniować ComponentGroup i Directory w tym samym czasie?

Mam dużą liczbę plików, rzędu 300 lub więcej, które muszą być podzielone na kilka grup, przy czym każda grupa ma około 50 plików.

Za pomocą narzędzia heat.exe udało mi się utworzyć fragment, który tworzy komponenty dla każdego pliku. Chciałbym uniknąć konieczności ponownej listy każdego z tych składników w osobnej definicji grupy komponentów. Chciałbym móc zawrzeć listę składników generowanych przez ciepło w definicji ComponentGroup, a następnie po prostu użyć tego ComponentGroupRef wewnątrz struktury DirectoryRef.

Mam nadzieję, że to wyjaśni. Obecnie muszę wykonać:

<DirectoryRef Id="FilesDir"> 
    <Component Id="a.txt" Guid="YOUR-GUID"> 
    <File Id="a.txt" KeyPath="yes" Source="SourceDir\a.txt" /> 
    </Component> 
    <Component Id="b.txt" Guid="YOUR-GUID"> 
    <File Id="b.txt" KeyPath="yes" Source="SourceDir\b.txt" /> 
    </Component> 
... 
    <Component Id="z.txt" Guid="YOUR-GUID"> 
    <File Id="z.txt" KeyPath="yes" Source="SourceDir\z.txt" /> 
    </Component> 
</DirectoryRef> 

<ComponentGroup Id="FilesGroup"> 
    <ComponentRef Id="a.txt"> 
    <ComponentRef Id="b.txt"> 
... 
    <ComponentRef Id="z.txt"> 
</ComponentGroup> 

Muszę podać każdy plik dwa razy. To śmierdzi.

Chciałbym móc zrobić:

<ComponentGroup Id="FilesGroup"> 
    <Component Id="a.txt" Guid="YOUR-GUID"> 
    <File Id="a.txt" KeyPath="yes" Source="SourceDir\a.txt" /> 
    </Component> 
    <Component Id="b.txt" Guid="YOUR-GUID"> 
    <File Id="b.txt" KeyPath="yes" Source="SourceDir\b.txt" /> 
    </Component> 
... 
    <Component Id="z.txt" Guid="YOUR-GUID"> 
    <File Id="z.txt" KeyPath="yes" Source="SourceDir\z.txt" /> 
    </Component> 
</ComponentGroup> 

<DirectoryRef Id="FilesDir"> 
    <ComponentGroupRef Id="FilesGroup"> 
</DirectoryRef> 

Czy to możliwe? Czy jest jakiś inny sposób na ułatwienie tego, czego po prostu nie widzę?

Aktualizacja: Opuściliśmy Wix i dlatego nie jestem pewien, czy powinienem oznaczyć rozwiązanie, czy nie. Jeśli ktoś uważa, że ​​jedna z odpowiedzi poniżej jest odpowiedzią na moje stare, dość stare pytanie, proszę dać mi znać, a ja oznaczyć odpowiednią odpowiedź jako taką.

Odpowiedz

7

Mam nadzieję, że rozumiem Twoje pytanie. Używam narzędzia heat na każdej kompilacji do automatycznego generowania wxs zawierających komponenty kierujące zawartość mojego katalogu wyjściowego kompilacji. WXS (po uproszczeniu) wygląda następująco:

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
     <ComponentGroup Id="CompGroup01"> 
      <Component Id="cmp1D6110E9A0B9E351095F414BEB4D2E35" Directory="Dir01" Guid="*"> 
       <File Id="fil53541B947C7CE0A96A604898F1B825C5" KeyPath="yes" Source="$(var.HarvestDir)\somefile.exe" /> 
      </Component> 
     </ComponentGroup> 
    </Fragment> 
</Wix> 

w Product.wxs mam link do kodu wygenerowany automatycznie zakodować:

<Directory Id="TARGETDIR" Name="SourceDir"> 
    <Directory Id="ProgramFilesFolder" Name="PFiles"> 
     <Directory Id="INSTALLDIR" Name="myInstallDir"> 
     <Directory Id="Dir01" Name="myInstallSubDir" /> 
     </Directory> 
    </Directory> 
</Directory> 

<Feature Id="ProductFeature" Title="MyProductComplete" Level="1"> 
    <ComponentGroupRef Id="CompGroup01" /> 
</Feature> 

w pliku wixproj istnieje „żniwa-zadanie” zdefiniowano (nie jest absolutnie czysty, ale działa). Wixproj nie jest kompletny, Usunąłem wszystkie istotne części:

<PropertyGroup> 
    <!-- relative path to directory from which setup will load input files --> 
    <MyWixSourceDir>C:\bin</MyWixSourceDir> 
    <!-- relative path to directory where inputs will be temporarily copied during harvesting --> 
    <MyWixHarvestDir>tempHarvest</MyWixHarvestDir> 
    <DefineConstants>Debug;HarvestDirApp=$(ProjectDir)$(MyWixHarvestDir)</DefineConstants> 
</PropertyGroup> 
<ItemGroup> 
    <!-- defines item group containing files which represent automatically harvested input for our WiX setup --> 
    <SetupInputFiles Include="$(MyWixSourceDir)\**\*.*" /> 
</ItemGroup> 
<ItemGroup> 
    <!-- defines item group of autogenerated files --> 
    <AutoGeneratedFiles Include="*.autogenerated.wxs" /> 
</ItemGroup> 
<Target Name="BeforeBuild"> 
    <!-- 1) prepare harvesting --> 
    <!-- remove temporary harvesting directory in case previous build did not cleaned up its temp files and folders --> 
    <RemoveDir Directories="$(ProjectDir)$(MyWixHarvestDir)" /> 
    <!-- delete old autogenerated files first --> 
    <Delete Files="@(AutoGeneratedFiles)" ContinueOnError="false" /> 
    <!-- 2) harvest application build output --> 
    <!-- copies input files into temporary directory so that they can be harvested into WXS file --> 
    <Copy SourceFiles="@(SetupInputFiles)" DestinationFiles="@(SetupInputFiles->'$(ProjectDir)$(MyWixHarvestDir)\%(RecursiveDir)%(Filename)%(Extension)')" ContinueOnError="false" /> 
    <!-- harvest files and produce WXS file defining all file and directory components for the setup --> 
    <Exec Command="&quot;$(WixExtDir)heat&quot; dir $(ProjectDir)$(MyWixHarvestDir) -dr Dir01 -sreg -srd -ag -cg CompGroup01 -var var.HarvestDirApp -out InstallDirApp.autogenerated.wxs" ContinueOnError="false" WorkingDirectory="." /> 
</Target> 
<Target Name="AfterBuild"> 
    <!-- 4) clean-up: remove temporary harvesting directory --> 
    <RemoveDir Directories="$(ProjectDir)$(KbcWixHarvestDir)" /> 
</Target> 

najważniejsza jest Exec elementem, który wykonuje zbiorów. Używam "-dr Dir01", aby zdefiniować, że komponenty będą odwoływały się do "Dir01" jako katalogu nadrzędnego, a "-cg ComGroup01" do definiowania grupy komponentów.

3
$ heat dir your_dir -gg -sfrag -cg ComponentGroupName -o myout.wxs 

Użyj opcji -h lub opisu opcji.

To da ci jeden ComponentGroup ID, który możesz podłączyć do wybranej funkcji.

Powiązane problemy