Wix - Ошибка ICE 64: Связать внешние группы компонентов

Я использую тепло для сбора файлов, которые мне нужны в качестве компонентов в моей установке, и записываю их в отдельный файл wxs, который отлично работает.

Пример сгенерированного файла:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="AppData_dir_ref">
            <Directory Id="GUID" Name="C" />
            <Directory Id="GUID" Name="OLD" />
        </DirectoryRef>
    </Fragment>

    <Fragment>
        <ComponentGroup Id="AppData_ComponentGroupId">
            <Component Id="GUID" Directory="GUID" Guid="{GUID}">
                <File Id="GUID" KeyPath="yes" Source="$(var.test)\C" />
            </Component> ...

... и так далее....

Теперь я использую их в моем SetupMain:

  <?xml version="1.0" encoding="UTF-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">

        <Product Id="*" 
                Name="SETUP TEST 1.0" 
                Language="1031"
                Version="1.0.0.0" 
                Manufacturer="bla" 
                UpgradeCode="ID">

            <Package Id="*"
                     Keywords="Installer"
                     InstallerVersion="300" 
                     Compressed="yes"
                     Languages='1031'
                     SummaryCodepage='1252'
                     Manufacturer="bla"
                     Description="Setup"
                     Comments="bla" 
                     InstallScope="perMachine"/>

            <Media Id="1" Cabinet="myapplication.cab" EmbedCab="yes" />

            <Directory Id="TARGETDIR" Name="SourceDir" >
                <Directory Id="LocalAppDataFolder" >
                    <Directory Id="AppData_dir_ref" Name="Test" />

                </Directory>
            </Directory>

            <Feature Id="F.Core" Title="bla" Level="1">
                <Feature Id="F.Data">
                    <ComponentGroupRef Id="AppData_ComponentGroupId" />
                </Feature>
            </Feature>

        </Product>
    </Wix>

К сожалению, я получил ошибки ICE64 для всех своих компонентов и каталогов:

Ошибка ICE64: каталог XX находится в профиле пользователя, но не указан в таблице RemoveFile. Ошибка ICE64: компонент xx enter code hereустанавливается в профиль пользователя, он должен зарегистрировать раздел реестра в HKCU в качестве пути к ключу, а не файл.. .

Как я могу это исправить? Я искал некоторое время в Интернете, но не мог найти подсказку. Кажется, это что-то очень простое, и в основном я забыл определить его в файле main. Моя цель состоит в том, чтобы создать простой установщик, который копирует структуру каталогов, определенную в сборке файла с помощью команды Heat, при установке и удаляет ее при удалении.

ОБНОВЛЕНИЕ 1: Небольшое обновление того, как я исправил ошибки с помощью ответов ниже, используя теги RemoveFolder и RegistryValue:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="AppData_dir_ref">
            <Directory Id="dir1" Name="C" />
            <Directory Id="dir2" Name="OLD" />
        </DirectoryRef>
    </Fragment>
    <Fragment>
        <ComponentGroup Id="Cg.R">
            <Component Id="test" Directory="Data" Guid="...">
                <RemoveFolder Id="Data" On="uninstall" Directory="AppData_dir_ref"/>
                <RemoveFolder Id="Rf.1" On="uninstall" Directory="C"/>
                <RemoveFolder Id="Rf.2" On="uninstall" Directory="OLD"/>
                <RegistryValue Root="HKCU" Key="Software\...\..." Name="installed" Type="integer" Value="1" KeyPath="yes"/>
            </Component>
        </ComponentGroup>    
    </Fragment>

    <Fragment>
        <ComponentGroup Id="Cg.D">
            <Component Id="cmp5" Directory="dirC23" Guid="...">
                <File Id="fil2" Source="Bla\...\...\...xml" />
                <RemoveFolder Id="Rf.b" On="uninstall" Directory="dirC23"/>
                <RegistryValue Root="HKCU" Key="Software\...\..." Name="installed" Type="integer" Value="1" KeyPath="yes"/>
            </Component>

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

Последний момент заключается в том, что у меня все еще есть предупреждения:

ICE91: Файл x будет установлен в каталог пользователя y, который не зависит от значения ALLUSERS. Этот файл не будет скопирован в профиль пользователя, даже если требуется установка на компьютере.

Я читал, что это предупреждение безвредно. Но в любом случае, было бы неплохо понять причину, чтобы, возможно, решить предупреждение когда-нибудь в будущем.


person Dave    schedule 09.09.2016    source источник


Ответы (1)


Обе эти ошибки проверки связаны с установкой в ​​профиль пользователя или установкой данных для каждого пользователя, как следует из выражения. Вкратце установка файлов, которые дублируются на диске для каждого пользователя: C:\Users\User1\MyFile.txt , C:\Users\User2\MyFile.txt и т. д. ...

Чтобы пройти проверку MSI, необходимо добавить запись удалить папку для всех устанавливаемых папок в путь к папке для каждого пользователя. В вашем случае это AppData_dir_ref.

Точно так же вам также необходимо указать путь к ключу реестра HKCU для компонентов, которые устанавливаются в профиль пользователя. Таким образом, вместо установки C:\Users\User1\MyPath вы задаете ключевой путь к чему-то вроде HKCU\Software\YourCompany\YourProduct для компонента, который устанавливается в профиль пользователя. .

У меня нет настройки Wix для тестовой компиляции, но вот макет примерно того, что вам нужно:

   <Component Id="RemoveFolder">
      <RemoveFolder Id="MyUserProfileFolder" On="uninstall" Directory="AppData_dir_ref"/>
      Your content here...
    </Component>

     ...

   <Component Id="UserProfile">
      <RegistryValue Root="HKCU" Key="SOFTWARE\YOURCOMPANY\YOURPRODUCT" Name="Complete" 
                     Value="TestValue" Type="string" KeyPath="yes"/>
      Your content here...
    </Component>
person Stein Åsmul    schedule 10.09.2016
comment
Спасибо. Ваш ответ помогает мне, так как я новичок в Wix. Остались еще вопросы: Как узнать, устанавливаю ли я в профиль пользователя? Это зависит от папки, в которую я устанавливаю? И не нужна ли мне папка удаления и путь к ключу реестра HKCU, если я устанавливаю на общий профиль машины (не пользовательский профиль)? - person Dave; 12.09.2016
comment
Да, профиль пользователя — это, как правило, любая папка в иерархии C:\Users. Все папки, которые вы добавляете сюда, должны иметь собственную запись RemoveFolder. И нет необходимости добавлять элементы RemoveFolder для каждой машины. - person Stein Åsmul; 12.09.2016
comment
Еще раз спасибо, чувак. Есть ли возможность добавить тег removefolder и тег RegistrationValue автоматически при использовании тепла или все это нужно делать самому? - person Dave; 12.09.2016
comment
Я не знаю какой-либо функции в файлеheat.exe для достижения этой цели. Я полагаю, вы могли бы использовать xslt для обновления сгенерированного источника. Или, может быть, запрос функции, чтобы файлheat.exe автоматически генерировал правильные значения в будущих выпусках. - person Stein Åsmul; 12.09.2016