Как установить файлы в Public Documents в модуле слияния? - PullRequest
0 голосов
/ 07 февраля 2019

Мне нужно установить какой-нибудь файл в Public Documents из моего модуля слияния.Я пытаюсь использовать свойство WIX_DIR_COMMON_DOCUMENTS, но все файлы установлены в Program Files.

Вот исходный код моего модуля слияния:

<PropertyRef Id="WIX_DIR_COMMON_DOCUMENTS" />

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="MergeRedirectFolder">
    <Directory Id="MirProgramFolder" Name="Data">
      <Component Id="cmpData" Guid="c64db3df-1bf3-4c03-8b69-ac1adbb8bfdd">
        <File Id="filData" Source="ForProgramFiles.txt"/>
      </Component>
    </Directory>
  </Directory>

  <!-- Files to install to public documents folder -->
  <Directory Id="WIX_DIR_COMMON_DOCUMENTS">
    <Directory Id="MirCommonDocumentsFolder" Name="MIR">
      <Component Id="cmpTest" Guid="22381726-2cf0-45f0-a9a8-9703ed456ed6">
        <File Id="filTest" Source="ForPublicDocs.txt"/>
      </Component>
    </Directory>
  </Directory>
</Directory>

А вот исходный код моего проекта установки:

<Product Id="*" Name="SetupProject1" Language="1033" Version="1.0.0.0" Manufacturer="Slava Antonov" UpgradeCode="7418b1ee-fb1e-4000-995f-4cff646346c5">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <MediaTemplate />

    <Feature Id="ProductFeature" Title="SetupProject1" Level="1">
  <MergeRef Id="MergeModule1"/>
    </Feature>
</Product>

<Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
        <Directory Id="ProgramFilesFolder">
            <Directory Id="INSTALLFOLDER" Name="SetupProject1" />
        </Directory>
    </Directory>
</Fragment>

<Fragment>
<DirectoryRef Id="INSTALLFOLDER">
  <Merge Id="MergeModule1" SourceFile="$(var.MergeModule1.TargetDir)MergeModule1.msm" DiskId="1" Language="1033"/>
</DirectoryRef>
</Fragment>

Почему WIX_DIR_COMMON_DOCUMENTS не работает в модуле слияния?

1 Ответ

0 голосов
/ 09 февраля 2019

Причина

Когда вы пишете <Directory Id="WIX_DIR_COMMON_DOCUMENTS"> в источнике модуля слияния, WiX модульно идентифицирует каталог, чтобы предотвратить конфликты с любыми существующими идентификаторами каталогов в продукте, который использует модуль слияния.,

Вы можете убедиться в этом, открыв файл MSM в Orca или InstEd (рекомендуется) и посмотрите на таблицу Directory.Вы увидите идентификатор каталога, например WIX_DIR_COMMON_DOCUMENTS.9FE2C761_1860_4D8C_8538_352164BDC12F.Добавленный GUID - это идентификатор модуля слияния.

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

Решение

Подавить модуляризацию для WIX_DIR_COMMON_DOCUMENTS следующим образом:

<PropertyRef Id="WIX_DIR_COMMON_DOCUMENTS"/>
<Property Id="WIX_DIR_COMMON_DOCUMENTS" SuppressModularization="yes"/>

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

E.г.в моем эксперименте я получил следующие предупреждения:

C:\Users\REDACTED\source\repos\SetupProject1\SetupProject1\Product.wxs(38,0): warning LGHT1056: The Directory table contains a row with primary key(s) 'WIX_DIR_COMMON_DOCUMENTS' which cannot be merged from the merge module 'C:\Users\REDACTED\source\repos\SetupProject1\MergeModule1\bin\Debug\MergeModule1.msm'.  This is likely due to collision of rows with the same primary key(s) (but other different values in other columns) between the database and the merge module.
C:\Users\REDACTED\source\repos\SetupProject1\SetupProject1\Product.wxs(38,0): warning LGHT1055: The InstallUISequence table contains an action 'WixQueryOsDirs' which cannot be merged from the merge module 'C:\Users\REDACTED\source\repos\SetupProject1\MergeModule1\bin\Debug\MergeModule1.msm'.  This action is likely colliding with an action in the database that is being created.  The colliding action may have been authored in the database or merged in from another merge module.  If this is a standard action, it is likely colliding due to a difference in the condition for the action in the database and merge module.  If this is a custom action, it should only be declared in the database or one merge module.
C:\Users\REDACTED\source\repos\SetupProject1\SetupProject1\Product.wxs(38,0): warning LGHT1055: The InstallExecuteSequence table contains an action 'WixQueryOsDirs' which cannot be merged from the merge module 'C:\Users\REDACTED\source\repos\SetupProject1\MergeModule1\bin\Debug\MergeModule1.msm'.  This action is likely colliding with an action in the database that is being created.  The colliding action may have been authored in the database or merged in from another merge module.  If this is a standard action, it is likely colliding due to a difference in the condition for the action in the database and merge module.  If this is a custom action, it should only be declared in the database or one merge module.
C:\Users\REDACTED\source\repos\SetupProject1\SetupProject1\Product.wxs(38,0): warning LGHT1056: The CustomAction table contains a row with primary key(s) 'WixQueryOsDirs' which cannot be merged from the merge module 'C:\Users\REDACTED\source\repos\SetupProject1\MergeModule1\bin\Debug\MergeModule1.msm'.  This is likely due to collision of rows with the same primary key(s) (but other different values in other columns) between the database and the merge module.
C:\Users\REDACTED\source\repos\SetupProject1\SetupProject1\Product.wxs(38,0): warning LGHT1056: The Property table contains a row with primary key(s) 'SecureCustomProperties' which cannot be merged from the merge module 'C:\Users\REDACTED\source\repos\SetupProject1\MergeModule1\bin\Debug\MergeModule1.msm'.  This is likely due to collision of rows with the same primary key(s) (but other different values in other columns) between the database and the merge module.

Итак, WiX сообщает нам, что он не может импортировать свойства WIX_DIR_COMMON_DOCUMENTS, SecureCustomProperties и пользовательское действие WixQueryOsDirs, поскольку они уже существуют в основном продукте.Здесь не о чем беспокоиться, потому что компоненты модуля слияния будут счастливо использовать существующее свойство WIX_DIR_COMMON_DOCUMENTS.

...