Проблемы с каталогом Wix

У меня два вопроса о каталогах с использованием фрагментов в XML установщика Windows.

Я получил этот файл-фрагмент из файла heat.exe:

    <?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="TARGETDIR">
            <Directory Id="dir08A07F5561FBEB6B9772467C730F6445" Name="Test" />
        </DirectoryRef>
    </Fragment>
    <Fragment>
        <ComponentGroup Id="InstallationFiles">
            <Component Id="cmp071F7F8F6B6027C8D2841272FE526A2B" Directory="dir08A07F5561FBEB6B9772467C730F6445" Guid="{CCCB70AC-29F5-4DAA-B03E-1A2266649AB6}">
                <File Id="fil63087E96FFB31F9E39B642CE8914F48B" KeyPath="yes" Source="SourceDir\dmedv.jpg" />
            </Component>
            <Component Id="cmpAE6CBEDA75641CF25BA9996AEB74A0DE" Directory="dir08A07F5561FBEB6B9772467C730F6445" Guid="{F5DABCAB-95D1-4197-A49F-E5F052A8E7EF}">
                <File Id="filD27F2F6B26F5C14563865FE6C2AD5D50" KeyPath="yes" Source="SourceDir\Files.txt" />
            </Component>
            <Component Id="cmp25C5EADB5C0A9E779D20EC7B77BD42B0" Directory="dir08A07F5561FBEB6B9772467C730F6445" Guid="{E301B04A-6EA5-496B-A58A-8898110BE57C}">
                <File Id="fil7C91C48D9AA0F2FE0EB37A21F108037F" KeyPath="yes" Source="SourceDir\readme.txt" />
            </Component>
            <Component Id="cmpD387AB4B40EDF14BF271ADDA7B71D2B7" Directory="dir08A07F5561FBEB6B9772467C730F6445" Guid="{6AF61DF4-32D0-4E7C-95B8-1DB9E7409029}">
                <File Id="fil966691BA382AFC9343430FE162643432" KeyPath="yes" Source="SourceDir\readme1.txt" />
            </Component>
            <Component Id="cmpB86212407C1BEA12838C8C7B20495E9F" Directory="dir08A07F5561FBEB6B9772467C730F6445" Guid="{921E971E-E224-464C-9FBC-FBC5F78B3E5B}">
                <File Id="fil61CD8EF43EA29DF58454E9A19F8C1EF9" KeyPath="yes" Source="SourceDir\readme2.txt" />
            </Component>
            <Component Id="cmpE4143B48FF854AE84F6054D4636FDE81" Directory="dir0ADF7E89B935DD39670130B4DC1D670E" Guid="{6F248718-93DD-4850-A18E-BD7079F738D5}">
                <File Id="fil03847B355B6AADE5E4E04D143C92BC67" KeyPath="yes" Source="SourceDir\Test2\dmedv2.jpg" />
            </Component>
        </ComponentGroup>
    </Fragment>
    <Fragment>
        <DirectoryRef Id="dir08A07F5561FBEB6B9772467C730F6445" />
    </Fragment>
    <Fragment>
        <DirectoryRef Id="dir0ADF7E89B935DD39670130B4DC1D670E" />
    </Fragment>
    <Fragment>
        <DirectoryRef Id="dir08A07F5561FBEB6B9772467C730F6445">
            <Directory Id="dir0ADF7E89B935DD39670130B4DC1D670E" Name="Test2" />
        </DirectoryRef>
    </Fragment>
</Wix>

и у меня есть этот установочный файл wix:

<?xml version='1.0' encoding='windows-1252'?>

<?define ProductVersion="1.0.0.0"?>
<?define ProductName="DMServices Installer"?>
<?define Manufacturer="DM EDV- und Bürosysteme GmbH"?>

<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'  xmlns:iis='http://schemas.microsoft.com/wix/IIsExtension'>
  <Product Name="$(var.ProductName)" Id='BB7FBBE4-0A25-4cc7-A39C-AC916B665220' UpgradeCode='8A5311DE-A125-418f-B0E1-5A30B9C667BD'
    Language='1033' Codepage='1252' Version="$(var.ProductVersion)" Manufacturer="$(var.Manufacturer)">

    <Package Id='*' Keywords='Installer'
      Description="DMService Installer Setup"
      Manufacturer='DM EDV- und Bürosysteme GmbH'
      InstallerVersion='100' Languages='1033' Compressed='yes' SummaryCodepage='1252' />

    <Media Id='1' Cabinet='Sample.cab' EmbedCab='yes' DiskPrompt="CD-ROM #1" />
    <Property Id='DiskPrompt' Value="the man" />

    <PropertyRef Id="NETFRAMEWORK35"/>
    <Condition Message='This setup requires the .NET Framework 3.5.'>
      <![CDATA[Installed OR (NETFRAMEWORK35)]]>
    </Condition>

   <Directory Id='TARGETDIR' Name='SourceDir'>
      <Directory Id='ProgramFilesFolder'>
        <Directory Id='DM' Name='DM EDV'>
          <Directory Id='INSTALLDIR' Name='DMServices'>
          </Directory>
        </Directory>
      </Directory>
   </Directory>

<Feature Id='InstallationFiles' Title='InstallationFiles' Level='1'>
      <ComponentGroupRef Id='InstallationFiles' />
    </Feature>

  </Product>
</Wix>

Уже.

Теперь, когда я генерирую эти файлы в wixobj, компилятор показывает ошибки, потому что файлы не могут быть найдены. Файлы находятся в каталоге под названием «Test». И в этом файле он называется SourceDir.

Для небольшого обходного пути я могу скопировать тестовый каталог и назвать его SourceDir ;-). Итак, моя установка будет создана.

  1. How can I do it without a second directory?
    • EDIT: Problem is done.

Теперь устанавливаю свой пакет. Но что бы я ни делал, файлы будут установлены в C: \ Test.

Но я хочу, чтобы он был установлен в моем каталоге программных файлов.

Во многих примерах я могу это сделать, как в файле, но мне нужно знать руководства. Но мы делаем wix для получения всех файлов из одного каталога, не прикладывая усилий.

  1. Итак, как установить файлы в каталог программных файлов?

person David Müller    schedule 03.03.2011    source источник


Ответы (2)


Присмотритесь к переключателю -dr на heat.exe. Вы можете поместить туда необходимую ссылку на каталог. Итак, определите структуру каталогов в основном файле, как вы это делаете сейчас, и укажите правильный идентификатор каталога для heat.exe.

ОБНОВИТЬ:

Хорошо, у меня работает следующее. Основная структура каталогов:

  <Directory Id="TARGETDIR" Name="SourceDir">
     <Directory Id="INSTALLLOCATION" Name="My folder">
        <Directory Id="WebsiteFolder" Name="Website">
        ...
        </Directory>
     </Directory>
  </Directory>

Функция ссылается на ComponentGroup:

<Feature Id="ProductFeature" Title="!(loc.ProductFeature.Title)" Level="100">
     ...
     <ComponentGroupRef Id="WebsiteFolderComponentGroup"/>
     ...
  </Feature>

Heat.exe генерирует следующий фрагмент:

    <Fragment>
        <DirectoryRef Id="WebsiteFolder">
            <Component Id="cmp1" Guid="GUID-GOES-HERE">
                <File Id="fil1" KeyPath="yes" Source="$(var.WebsiteFolderSource)\Default.aspx" />
            </Component>
            <Component Id="cmp2" Guid="GUID-GOES-HERE">
                <File Id="fil2" KeyPath="yes" Source="$(var.WebsiteFolderSource)\default.css" />
            </Component>
            <Directory Id="dir1" Name="App_Browsers">
                <Component Id="cmp3" Guid="GUID-GOES-HERE">
                    <File Id="fil3" KeyPath="yes" Source="$(var.WebsiteFolderSource)\App_Browsers\Form.browser" />
                </Component>
            </Directory>
            <Directory Id="App_Config" Name="App_Config">
                <Component Id="cmp4" Guid="GUID-GOES-HERE">
                    <File Id="fil4" KeyPath="yes" Source="$(var.WebsiteFolderSource)\App_Config\ConnectionStrings.config" />
                </Component>
            </Directory>
            <Directory Id="bin" Name="bin">
                <Component Id="cmp5" Guid="GUID-GOES-HERE">
                    <File Id="fil5" KeyPath="yes" Source="$(var.WebsiteFolderSource)\bin\MySystem.Web.UI.dll" />
                </Component>
                <Component Id="cmp6" Guid="GUID-GOES-HERE">
                    <File Id="fil6" KeyPath="yes" Source="$(var.WebsiteFolderSource)\bin\Another.dll" />
                </Component>
              ...
            </Directory>
        ...
        </Directory>

...

        <ComponentGroup Id="WebsiteFolderComponentGroup">
            <ComponentRef Id="cmp1" />
            <ComponentRef Id="cmp2" />
            <ComponentRef Id="cmp3" />
            <ComponentRef Id="cmp4" />
            ...
        </ComponentGroup>

И, наконец, команда heat, которая генерирует необходимые выходные данные, выглядит так (образец Nant):

  <exec program="heat.exe" verbose="true" basedir="${paths.source}">
     <arg line='dir "${paths.dist.website}"'/><!-- Notice the quotes inside the attributes -->
     <arg line='-srd'/>
     <arg line='-dr WebsiteFolder'/>
     <arg line='-cg WebsiteFolderComponentGroup'/>
     <arg line='-out "${paths.harvest}\website.wxs"'/>
     <arg line='-ke -sfrag -scom -sreg -gg'/>
     <arg line='-var var.WebsiteFolderSource'/>
  </exec>

Эти фрагменты содержат достаточно информации, чтобы понять, как все это работает. Поиграйте с переключателями heat.exe, чтобы найти нужную комбинацию. Удачи!

person Yan Sklyarenko    schedule 03.03.2011
comment
Теперь я построил установку с выбором каталога. Но то же самое. Файлы будут установлены в C: \ Test. Я должен сказать установочному файлу wix: <Directory Id='TARGETDIR' Name='SourceDir'> <Directory Id='ProgramFilesFolder'> <Directory Id='DM' Name='DM EDV'> <Directory Id='INSTALLDIR' Name='DMServices'> INSTALL FEATURE HERE </Directory> </Directory> </Directory> </Directory> - person David Müller; 03.03.2011
comment
Изучите первый урок известного учебника: tramontana.co.hu/wix/lesson1. php и скачайте готовый образец. Он должен ответить на ваши вопросы о структурах каталогов. - person Yan Sklyarenko; 03.03.2011
comment
Когда я знаю все идентификаторы и имена компонентов, я могу записать их в дерево каталогов. Но у меня есть сегмент со всеми файлами, который будет прочитан в Feature Group (через ComponentGroupRef Id). Как установить эту группу в каталоги? - person David Müller; 04.03.2011
comment
Попробую скинуть тебе пробу сегодня-завтра - person Yan Sklyarenko; 04.03.2011
comment
Это лучшая часть документации WIX, которую я когда-либо встречал в intertubes. Спасибо большое за шарина. - person José F. Romaniello; 27.11.2013
comment
Я сделал именно так, как показано выше, но при сборке у меня возникли ошибки ICE64. Есть идеи, что я сделал не так? Для некоторого кода см. Мой вопрос: stackoverflow.com/questions/39413247/ - person Dave; 10.09.2016
comment
Я строю из CLI. Я не мог понять, откуда взялся var.WebsiteFolderSource. Но если я вместо этого использовал wix.WebsiteFolderSource, а затем передал -dWebsiteFolderSource=<some\path\here> в light.exe, он работал отлично! Спасибо. - person Terje Dahl; 27.12.2018

В случае, если люди вроде меня все еще ищут разъяснений: <DirectoryRef Id="WebsiteFolder"> в тепловом фрагменте важен, это ссылка на то, где должны быть установлены файлы фрагментов. Если у вас есть несколько фрагментов и вы хотите разместить их в разных местах, DirectoryRef является ключом.

person user2904724    schedule 21.10.2013
comment
Не могли бы вы рассказать поподробнее? - person Steve Westbrook; 22.10.2013