В Wix можно ли определить ComponentGroup и Directory одновременно? - PullRequest
18 голосов
/ 26 января 2010

Я новичок в WiX. Очень новый Есть ли способ определить и ComponentGroup и Каталог одновременно?

У меня есть большое количество файлов, порядка 300 или около того, которые нужно разбить на несколько групп, каждая из которых имеет около 50 файлов.

Используя heat.exe, я смог создать фрагмент, который создает компоненты для каждого файла. Я хотел бы избежать повторного перечисления каждого из этих компонентов в отдельном определении ComponentGroup. Я хотел бы иметь возможность обернуть список компонентов, сгенерированных высокой температурой, в определение ComponentGroup, а затем просто использовать этот ComponentGroupRef внутри структуры DirectoryRef.

Надеюсь, это прояснит ситуацию. В настоящее время я должен сделать:

<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, и поэтому я не уверен, стоит ли мне отмечать решение или нет. Если кто-то посчитает, что один из ответов ниже является ответом на мой довольно старый вопрос, пожалуйста, дайте мне знать, и я отмечу соответствующий ответ как таковой.

Ответы [ 2 ]

7 голосов
/ 15 ноября 2010

Надеюсь, я правильно понял ваш вопрос. Я использую инструмент высокой температуры в каждой сборке, чтобы автоматически генерировать wxs, содержащие компоненты, предназначенные для содержимого моего выходного каталога сборки. WXS (после упрощения) выглядит так:

<?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 У меня есть эта жесткая ссылка на автоматически сгенерированный код:

    <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 определена «задача сбора урожая» (она не совсем чистая, но работает). 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 голосов
/ 03 января 2013
$ heat dir your_dir -gg -sfrag -cg ComponentGroupName -o myout.wxs

Используйте флаг -h или описание параметров.

Это даст вам один ComponentGroup ID, который вы можете подключить к желаемой функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...