Wix- Как скопировать каталог для установки папки
У меня есть папка Bin со многими файлами в моем проекте. На данный момент я знаю, как добавлять определенные файлы для установки папки с помощью кода ниже.
<File Source='$(var.Debug)Myapplication.exe' Id='file4028276A0CAD84E3BDE449237AE31A5F' />
Однако я хочу переместить целую директорию на путь установки. Например, переместите всю папку "Bin" на путь установки "C:\Myapplication".
Что мне делать тогда?
Спасибо заранее!
Ответы
Ответ 1
как включить большое дерево каталогов в установщик wix
Это выглядит хорошо. Но слишком много работы.
Как скопировать папку в wix
Указанная ссылка работала нормально. Но нельзя копировать подпапки.
Итак, что я сделал, я создал приложение, которое читает всю папку и получает ее вспомогательные каталоги и файлы и генерирует необходимые блоки кода, например
<Component Id="myfile" Guid="GUID">
<File Id="myfile.txt" Source="MySourceFiles\myfile.txt" KeyPath="yes" Checksum="yes"/>
</Component>
Затем я добавил сгенерированный блок кода в файл .wxs.
Первоначальное время, затрачиваемое на создание этого приложения, не напрасно. Потому что вы можете продолжать использовать его навсегда.
Я рекомендую вам скопировать файл по файлу, потому что он полезен при обновлении или ремонте. MSI хранит запись для каждого файла, который должен быть скопирован. Таким образом, он поддерживается и полезен при модернизации и ремонте.
Ответ 2
Похоже, что вы хотите использовать инструмент WiX heat
, который используется для "сбора" каталога (или отдельных файлов) и создания файла фрагмента WiX, который вы можете использовать в своем проекте.
Например, у вас есть каталог, который вы хотите собрать, и он может включать в себя подкаталоги, но есть много файлов, и вы хотите все это... тепло сделает это для вас.
Рассмотрим эту тривиальную структуру:
Somedir
|
|---A file.txt
|---An init file.ini
|---another file.txt
|---subfolder
|
|---a subfolder file.txt
Если вы используете тепло для сбора этого каталога, инструмент сгенерирует файл фрагмента для вас, который вы можете использовать в качестве ссылки на компонент в своем проекте, без необходимости указывать файлы по одному или использовать обходное решение.
Например, следующая команда тепла обработает этот каталог (с одного уровня в этом примере)
heat dir somedir -o MyHarvestedStuff.wxs -scom -frag -srd -sreg -gg -cg MyComponentGroupId -dr BIN_DIR_REF
Где:
dir = harvest a directory
somedir = directory you want to harvest
-o MyHarvestedStuff.wxs = the output fragment file
-scom -sfrag -srd -sreg = Suppress COM elements, fragments, root directory as element, registry harvesting (these options will create a grouping that most applications can use)
-gg = generate GUID now (this will put the GUID into your output file, rather than using a wildcard "*". The advantage here is you can use non-standard TARGETDIR, which would not qualify for autogenerated GUID's)
-cg MyComponentGroupId = component group. this is what you will use in your feature set to include these files
-dr BIN_DIR_REF = this is the directory reference for which to place the files in your final package.
Получающийся XML выглядит следующим образом (это было выполнено без -gg, чтобы избежать публикации реальных GUID)
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="BIN_DIR_REF">
<Directory Id="dirF065D7446868E03DB0B296EBADA4E4A1" Name="subfolder" />
</DirectoryRef>
</Fragment>
<Fragment>
<ComponentGroup Id="MyComponentGroupId">
<Component Id="cmp739547000B47E975B0452D876AF7810B" Directory="BIN_DIR_REF" Guid="PUT-GUID-HERE">
<File Id="fil09B311A6D1EABD9E94DFA5C83F59C548" KeyPath="yes" Source="SourceDir\A file.txt" />
</Component>
<Component Id="cmp84C8400F892D39B05EE3021CCEEAA14F" Directory="BIN_DIR_REF" Guid="PUT-GUID-HERE">
<File Id="fil11A22646343997D26AC54171A62DFF4C" KeyPath="yes" Source="SourceDir\an init file.ini" />
</Component>
<Component Id="cmpFA266FC6F3269CB5D9E42C38FC995117" Directory="BIN_DIR_REF" Guid="PUT-GUID-HERE">
<File Id="filA545B6E4B63B8211E982917FC78F6EB4" KeyPath="yes" Source="SourceDir\another file.txt" />
</Component>
<Component Id="cmp2EC5C1618A59F47B7BDE800EB9AA8688" Directory="dirF065D7446868E03DB0B296EBADA4E4A1" Guid="PUT-GUID-HERE">
<File Id="filB0CD0B02385137DC806112E293083459" KeyPath="yes" Source="SourceDir\subfolder\a subfolder file.txt" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>
В вашем файле проекта у вас есть что-то вроде этого в корневом элементе <Directory>
:
<Directory Id="BIN_DIR_REF" Name="bin">
<!-- anything else you might put here...-->
</Directory>
И в вашей группе функций:
<Feature Id="Complete" Level="1">
...
<ComponentGroupRef Id="MyComponentGroupId" />
...
</Feature>
Связывание всех вместе...
Не позволяйте длине ответа отвлечь вас от изучения этого решения, оно работает довольно хорошо, и это довольно просто. Теперь, если вы хотите исключить что-либо из этого каталога, это еще одна история...