2010-01-25 50 views
18

我是新來的WiX。非常新。有沒有辦法同時定義ComponentGroup和Directory?在Wix中,可以同時定義ComponentGroup和Directory嗎?

我有大量的文件,大約需要300個左右的數量,需要拆分成多個組,每個組有大約50個文件。

使用heat.exe,我能夠創建一個片段,爲每個文件創建組件。我想避免必須在單獨的ComponentGroup定義中重新列出每個這些組件。我希望能夠在ComponentGroup定義中包裝由熱量生成的組件列表,然後在DirectoryRef結構中使用該ComponentGroupRef。

我希望這可以清除它。我目前必須做的:

<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> 

我必須列出每個文件兩次。臭死了。

我希望能夠做到:

<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> 

這可能嗎?有沒有其他的方法讓我更容易,我只是沒有看到?

更新:我們放棄了Wix,因此我不確定是否應該標記解決方案。如果有人覺得下面的答案之一是我現在相當古老的問題的答案,請讓我知道,我會標記適當的答案。

回答

7

我希望我理解你的問題是正確的。我在每個構建上使用熱工具來自動生成包含針對我的構建輸出目錄內容的組件的wxs。該WXS(簡化後)看起來是這樣的:

<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> 

在wixproj文件有一個「豐收任務」中定義:

<?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> 
在Product.wxs我有這樣的硬編碼鏈接自動生成的代碼

(它不是絕對乾淨,但它的工作原理)。 wixproj不完整,我刪除了所有不相關的部分:

<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> 

最重要的是執行收割的Exec元素。我使用「-dr Dir01」來定義組件將引用「Dir01」作爲父目錄,並使用「-cg ComGroup01」來定義componentGroup。

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

使用-h標誌或選項的說明。

這會給你一個單一的ComponentGroup ID,你可以插入你想要的功能。

相關問題