Как я могу использовать bindpaths для создания патча WiX?

Я использую cmake/cpack для создания своего проекта с WiX.

cmake запускает программуheat.exe (или что-то подобное), которая создает файлы files.wxs, содержащие файлы моего проекта в следующем формате:

Предположим, что один файл с именем a.txt находится внутри папки с именем «bin». Проект построен в NewFolder на рабочем столе.

<DirectoryRef Id="CM_DP_bin">
    <Component Id="CM_CP_bin.a.txt" Guid="*">
        <File Id="CM_FP_bin.a.txt" Source="C:/Users/mindlessbot/Desktop/NewFolder/_CPack_Packages/WIX/packageName/bin/a.txt" KeyPath="yes"/>
    </Component>
</DirectoryRef>

После создания MSI весь NewFolder перемещается в другой каталог (на нашем сервере). В результате, когда я пытаюсь создать патч WiX, используя выходной файл .wixpdb, я получаю следующую ошибку:

error PYRO0103 : The system cannot find the file 'C:/Users/mindlessbot/Desktop/NewFolder/_CPack_Packages/WIX/packageName/bin/a.txt'

Погуглив, я обнаружил, что .wixpdb содержит ссылки на файлы, которые изменили свое местоположение, поэтому, естественно, не может их найти. Я нашел поток, в котором кто-то предоставил команды для использования bindpaths, однако, поскольку я использую cpack, я не могу напрямую их вызывать.

Итак, как я должен это сделать?

Некоторая дополнительная информация:

Мой проект содержит несколько файлов wxs (не уверен, что это имеет значение)

Команда cpack:

path/to/cpack.exe -G WIX --config path/to/config.cmake

Команда patch запускается отдельно:

torch.exe -p -xi path/to/oldInstaller.wixpdb path/to/newInstaller.wixpdb -out path/to/patch.wixmst
candle.exe path/to/patch.wxs -out path/to/patch.wixobj
light.exe path/to/patch.wixobj -out path/to/patch/wixmsp
pyro.exe path/to/patch.wixmsp -out path/to/patch.msp -t PatchBaselineID path/to/patch/wixmst

person user3673613    schedule 09.08.2017    source источник


Ответы (1)


Если вы хотите создать свои MSI на одном компьютере, а патч — на другом, я рекомендую использовать подход .wixout, а не полагаться на подход .wixpdb. Файл .wixout может быть создан тем же инструментом командной строки набора инструментов WiX, который используется для создания MSI, light.exe. .wixout

Полную документацию по компоновщику набора инструментов WiX, light.exe, можно найти здесь . Ниже приведен пример использования light.exe для создания файла .wixout:

"C:\Program Files (x86)\WiX Toolset v3.11\bin\light.exe" "/path/to/Some.wixobj" "/path/to/Another.wixobj" "/path/to/AndYetAnother.wixlib" -bf -xo -out "/path/to/MyInstaller_v1.wixout"

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

  • "/path/to/Some.wixobj" "/path/to/Another.wixobj" "/path/to/AndYetAnother.wixlib" — это скомпилированные выходные файлы исходных файлов WiX, они могут быть файлами .wixobj (созданными с помощью candle.exe) или файлами .wixlib (сгенерированными с помощью lit.exe, способ объединения файлов .wixobj в одну общую библиотеку).
  • -bf — этот переключатель приводит к тому, что все файлы связываются с результирующим файлом .wixout. Это устраняет необходимость иметь точную структуру папок на целевой машине при создании патчей, поскольку файлы переносятся с файлом .wixout.
  • -xo — этот переключатель указывает компоновщику выводить XML-представление MSI вместо фактического MSI. Это необходимо для использования переключателя -bf.
  • -out "/path/to/MyInstaller_v1.wixout" — указывает компоновщику, куда выводить файл .wixout.

Если у вас есть возможность создавать файлы .wixout, команду torch.exe можно изменить для запуска на основе файлов .wixout вместо файлов .wixpdb и связанных с ними структур папок. Ниже показано, как я бы изменил вашу команду torch.exe, чтобы использовать файлы .wixout, а не файлы .wixpdb:

torch.exe -p -xi "path/to/oldInstaller.wixout" "path/to/newInstaller.wixout" -out "path/to/patch.wixmst"

Итак, в целом мне очень нравится этот подход, и обычно я заставляю процесс сборки создавать как файл .msi, так и файл .wixout. Это позволяет нам кэшировать различные сборки/версии нашего установщика в виде файлов .wixout, а затем процесс создания патча между различными версиями файлов .wixout становится относительно простым.

person pixelTitan    schedule 18.06.2018