Изменение TARGETDIR в WiX

У меня проблемы с настройкой пути TARGETDIR. я использовал dark.exe перепроектировать рабочий файл MSI и прочитать все сообщения, которые я смог найти на эту тему, но я, кажется, не могу настроить TARGETDIR, чтобы он указывал путь ProgramFiles\Manufacturer\Product, Ниже приведено удаление моего файла WXS, в результате чего мое приложение по какой-то причине было установлено в корень моего D-диска:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*"
             Name="FBL - Some App"
             Language="1033"
             Version="1.0.0.0"
             Manufacturer="Foo &amp; Bar Limited"
             UpgradeCode="780286c6-e064-4402-80d8-dd2c68b56c04">
        <Package InstallerVersion="200"
                 Compressed="yes"
                 InstallScope="perMachine"
                 Comments="Performs some operation that is important" />

        <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
        <Media Id="1" Cabinet="App.1.0.0.cab" EmbedCab="yes" />
        <CustomAction Id="setTARGETDIR"
                      Property="TARGETDIR"
                      Value="[ProgramFilesFolder][Manufacturer]\[ProductName]"
                      Execute="firstSequence"
                      Return="check" />

        <Directory Id="TARGETDIR" Name="SourceDir">
            <Component Id="C__App.exe"
                       Guid="{074586E9-A675-2734-A4CD-1CE520922A41}">
                <File Id="F__App.exe"
                      Name="App.exe"
                      KeyPath="yes"
                      Assembly=".net"
                     AssemblyManifest="F__App.exe"
                      AssemblyApplication="F__App.exe"
                      DiskId="1"
                      Source="D:\SomePath\bin\Debug\App.exe" />
            </Component>
        </Directory>
        <Feature Id="DefaultFeature" ConfigurableDirectory="TARGETDIR" Level="1">
            <ComponentRef Id="C__App.exe" Primary="yes" />
        </Feature>
        <Icon Id="favicon.ico" SourceFile="d:\SomePath\favicon.ico" />
        <Property Id="ARPPRODUCTICON" Value="favicon.ico" />
        <UI />
        <InstallExecuteSequence>
            <Custom Action="setTARGETDIR" Before="CostFinalize" />
        </InstallExecuteSequence>
    </Product>
</Wix>

Я уверен, что упускаю что-то простое, но я не могу найти дополнительную информацию о том, что делать отсюда.

5 ответов

Решение

Были необходимы следующие модификации:

<CustomAction Id="SetTARGETDIR"
              Directory="TARGETDIR"
              Value="[ProgramFilesFolder][Manufacturer]\[ProductName]"
              Return="check" />

а также

<InstallExecuteSequence>
    <Custom Action="SetTARGETDIR" After="InstallValidate" />
</InstallExecuteSequence>

Объяснение: Используйте атрибут Directory вместо свойства (это настраиваемое действие типа 35) и запланируйте это действие после InstallValidate в последовательности выполнения - это когда каталоги проверяются на доступ для записи и действительно устанавливаются.

(Спасибо Нарине Чандре Сехар из группы пользователей WiX за ответ на этот вопрос.)

Это странно... У меня была такая же проблема, но ваш ответ не сработал для меня. Все, что мне было нужно, это:

<Product>
   <SetProperty Id='TARGETDIR' Value='[ProgramFilesFolder][Manufacturer]\[ProductName]\' Before='FindRelatedProducts' />
   ...
</Product>

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

Редактировать: На самом деле это была плохая идея. Часто некоторые из этих встроенных пользовательских действий можно вызывать на разных этапах процесса установки, поэтому лучше добавить пользовательское действие для установки свойства.

Вот что сработало для меня:

<Product>
   <CustomAction Id='SetTARGETDIR' Property='TARGETDIR' Value='[ProgramFilesFolder][Manufacturer]\[ProductName]\'/>
   ...
</Product>
<InstallUISequence>
   <Custom Action='SetTARGETDIR' Sequence='1'/>
   ...
</InstallUISequence>
<AdminUISequence>
   <Custom Action='SetTARGETDIR' Sequence='1'/>
   ...
</AdminUISequence>

У меня ничего не получалось, поэтому я запустил msi с помощью командной строки, установив свойство каталога установки. По умолчанию моя программа будет установлена ​​на диск C, но иногда я хотел, чтобы она была установлена ​​на диск D, поэтому я сделал следующее:

<Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
               <Directory Id="APPLICATIONROOTDIRECTORY" Name="XServer">                     
               </Directory>
            </Directory>
</Directory>

Вот командная строка:

XServer.msi / L * v log.log APPLICATIONROOTDIRECTORY = "D: \ Program Files (x86) \ XServer"

Это действительно сработало для меня. В CostFinalize действие где TARGETDIR Каталог определен.

<SetProperty Id="TARGETDIR" Value="[ROOTDRIVE]MyCompany" Sequence="first" Before="CostFinalize">NOT Installed AND NOT TARGETDIR</SetProperty>

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

      After="CostInitialize"
Другие вопросы по тегам