Заставьте WIX установщик поместить файлы в AppData - PullRequest
0 голосов
/ 01 октября 2018

Я пишу dapp для клиента ethereum для Windows.Чтобы сделать dapp доступным для пользователя, я должен поместить определенные файлы в папку в appdata.Так что я просто должен поместить несколько файлов в %appdata%\Parity\Ethereum\dapps\mydappname.Но я всегда получаю странные ошибки с WIX, последняя из которых

Ошибка 93 ICE64: каталог dapp находится в профиле пользователя, но не указан в таблице RemoveFile.

У меня следующие myapp.wixproj

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" InitialTargets="EnsureWixToolsetInstalled" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
    <ProductVersion>3.10</ProductVersion>
    <ProjectGuid>8beed2e4-8784-4cb5-8648-cdf55c5defe6</ProjectGuid>
    <SchemaVersion>2.0</SchemaVersion>
    <OutputName>FairsDapp</OutputName>
    <OutputType>Package</OutputType>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
    <OutputPath>bin\$(Configuration)\</OutputPath>
    <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
    <DefineConstants>Debug</DefineConstants>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    <OutputPath>bin\$(Configuration)\</OutputPath>
    <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
  </PropertyGroup>
  <PropertyGroup>
    <DefineConstants>HarvestPath=dapp</DefineConstants>
  </PropertyGroup>      
  <ItemGroup>
    <Compile Include="Product.wxs" />
    <Compile Include="Dapp.wxs" />
  </ItemGroup>
  <Import Project="$(WixTargetsPath)" Condition=" '$(WixTargetsPath)' != '' " />
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets" Condition=" '$(WixTargetsPath)' == '' AND Exists('$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets') " />
  <Target Name="EnsureWixToolsetInstalled" Condition=" '$(WixTargetsImported)' != 'true' ">
    <Error Text="The WiX Toolset v3.11 (or newer) build tools must be installed to build this project. To download the WiX Toolset, see http://wixtoolset.org/releases/" />
  </Target>
  <Target Name="BeforeBuild">
  <HeatDirectory
    DirectoryRefId="INSTALLFOLDER"
    OutputFile="Dapp.wxs"
    Directory="dapp"
    ComponentGroupName="SourceComponentGroup"
    ToolPath="$(WixToolPath)"
    PreprocessorVariable="var.HarvestPath"
    AutogenerateGuids="true" />
  </Target>
</Project>

И следующие wxs:

<?xml version="1.0" encoding="UTF-8"?>
<Wix
    xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Name="Dapp" Language="1049" Version="1.0.0.3" Manufacturer="Me" UpgradeCode="fb09dccc-6606-4b5d-8dcb-28146c28663a" Codepage="1251">
        <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
        <MediaTemplate EmbedCab="yes"/>
        <Feature Id="ProductFeature" Title="FDapp" Level="1">
            <ComponentGroupRef Id="ProductComponents" />
        </Feature>
    </Product>
    <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="AppDataFolder">
                <Directory Id="Parity">
                    <Directory Id="dapps">
                        <Directory Id="INSTALLFOLDER" Name="F2"></Directory>
                    </Directory>
                </Directory>
            </Directory>
        </Directory>
    </Fragment>
    <Fragment>
        <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"></ComponentGroup>
    </Fragment>
</Wix>

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

1 Ответ

0 голосов
/ 02 октября 2018

Я незнаком с этим типом приложения (dapp для клиента ethereum для Windows), поэтому совет должен быть общим, боюсь.

Файлы для отдельных пользователей и настройки реестра: Как правило, развертывание файлов в профиле пользователя и настройках HKCU затруднено с помощью MSI.Как указывает Крис, в основном это работает только для пользователя, устанавливающего MSI, если только вы не добавляете конструкции для активного копирования файлов во все профили пользователей, и даже тогда это выглядит неуклюже.

Подходы : я давно написал длинный ответ на эту тему: Создать папку и файл в профиле текущего пользователя из профиля администратора (длинный и сложный, но без каких-либо автоматических решений),

Предпочтительный подход : Прежде чем ввязываться в слишком сложную задачу, обычно проще всего использовать приложение для копирования файлов userprofile на месте для каждогоuser при первом запуске - вместо использования программы установки для установки пользовательских файлов.

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

  • Подход 1 : установить файлы шаблонов для каждого компьютера, а затем скопировать их каждому пользователюuserprofile при запуске приложения.

  • Подход 2 : В качестве альтернативы мне нравится загружать файлы непосредственно с сервера или базы данных и помещать в файл userprofile -также при первом запуске.

Применить обновления? : Есть способы обеспечить повторное копирование файлов, если есть изменения вваши шаблоны, как описано здесь: http://forum.installsite.net/index.php?showtopic=21552 (февраль 2019 г. преобразован в ссылку WayBack Machine).


Ошибки : конкретныеПроблема, о которой вы сообщаете, связана с необходимостью указания пути к разделу реестра для каждого пользователя и записи RemoveFolder для всех папок, нацеленных на расположения пользовательских профилей:

  <Directory Id="AppDataFolder">
    <Directory Id="Parity">
      <Directory Id="dapps">
        <Directory Id="INSTALLFOLDER" Name="F2">
          <Component Guid="{77777777-7777-7777-7777-7777777777DD}" Feature="MainApplication">

            <RegistryKey Root="HKCU" Key="Software\TestManufacturer\TestApp">
              <RegistryValue Name="Flag" Value="1" Type="string" KeyPath="yes" />
            </RegistryKey>

            <RemoveFolder Id="RemoveINSTALLFOLDER" Directory="INSTALLFOLDER" On="uninstall" />
            <RemoveFolder Id="RemoveParity" Directory="Parity" On="uninstall" />
            <RemoveFolder Id="Removedapps" Directory="dapps" On="uninstall" />

            <File Source="Test.exe" />
          </Component>
        </Directory>
      </Directory>

Это всего лишь одно из соглашений и измышлений MSI. Как уже говорилось, установите все файлы для каждой машины и скопируйте их в профиль пользователя вместе с приложением.В будущем они будут отстранены от любых помех настройки .Тогда вам не нужно иметь дело с этими проблемами RemoveFolder.


...