Может ли установщик WIX MSI скопировать полностью внешний файл, которого нет в установщике?

У меня есть установщик Windows со сложным интерфейсом в WPF 4.5. Он использует несколько других файлов установщика MSI, созданных для нескольких других компонентов с использованием WIX, которые находятся внутри подкаталогов, например:

  • InstallerRootDirectory
    • WPF_Executable_File[The main installer]
    • File_A
    • File_B
    • Directory_A
    • Directory_B
    • Directory_c
      • MSI Installer 1
      • Установщик MSI 2

Мне нужен установщик MSI Installer 2, созданный из WIX, чтобы иметь возможность копировать File_B в директорию установки для этого компонента на целевой машине.

File_B создается во время выполнения из WPF_Executable_File и недоступен во время сборки MSI.

Могу ли я сделать это напрямую через WIX или мне нужно использовать настраиваемое действие?

Я пробовал следующий код, но он дает ошибку:

<Component Id="cmpA9616EB16BF74D7E90C6CD0D590A18ED" Directory="dir39B22699688E51DCD8DCBB99A47E835B" Guid="{DAD3EA2B-830F-482C-8F2F-EEB3C49E6373}">
<CopyFile SourceDirectory="../../[SourceDir]" SourceName="abc.xml"  DestinationProperty="dir39B22699688E51DCD8DCBB99A47E835B" Id="copyfile1" />
</Component>

Ошибка: значение атрибута SourceDirectory не является допустимым идентификатором.

Использование SourceProperty также дает ту же ошибку.


person teenup    schedule 28.05.2014    source источник
comment
Я думаю, вам нужно будет пойти по маршруту Custom Action. Если запуск .exe - единственный способ сгенерировать файл, вам нужно будет сделать это до того, как вы попытаетесь скопировать файл. Другой вариант - заставить exe скопировать файл в необходимый каталог при его запуске и удалить копию файла в установщике MSI 2.   -  person Kcvin    schedule 28.05.2014
comment
Элемент <CopyFile> - правильный путь в этой ситуации. Это поможет, если вы укажете полученную ошибку.   -  person Yan Sklyarenko    schedule 28.05.2014
comment
Я обновил ошибку в вопросе.   -  person teenup    schedule 28.05.2014
comment
CopyFile будет работать, вам просто нужно уточнить детали. Вам просто нужны настоящие имена каталогов, и я почти уверен, что вы не сможете использовать .. \ ..   -  person PhilDW    schedule 28.05.2014
comment
Если я не могу использовать .. \ .., то как мне перейти в родительский каталог [SourceDir]? Есть ли способ получить родительский каталог?   -  person teenup    schedule 28.05.2014


Ответы (1)


Я согласен, что <CopyFile> - лучшая альтернатива. Однако я пробовал использовать Robocopy, и у меня это сработало.

<CustomAction Id="BaselineSync_Cmd" Property="BaselineSync" Execute="immediate"
    Value="&quot;robocopy&quot; &quot;[BUP]&quot; &quot;[PROD]&quot; /PURGE /e" />
<CustomAction Id="BaselineSync" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="ignore" Impersonate="no"/>

<InstallExecuteSequence>
    <Custom Action="BaselineSync_Cmd" After="StartServices"><![CDATA[NOT(Installed)]]></Custom>
    <Custom Action="BaselineSync" After="BaselineSync_Cmd"><![CDATA[NOT(Installed))]]></Custom>
</InstallExecuteSequence>

В этом случае я передаю значения BUP и PROD при вызове установщика. Что-то вроде: msiexec / i BUP = C: \ somefolderpath PROD = C: \ someotherfolderpath / qn / l * v install.log

person Sourav Kundu    schedule 24.09.2014