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>

Связывание всех вместе...

  • Поместите свой новый файл фрагмента в candle вместе со своим другим файлом.
  • Поставьте файл .wixobj, который candle создает для light
  • Отремонтируйте ссылку SourceDir в новом файле фрагмента с помощью переменной препроцессора WiX или с опцией -b на light

    Пример: light ... -b "path to my directory that I harvested" ...

Не позволяйте длине ответа отвлечь вас от изучения этого решения, оно работает довольно хорошо, и это довольно просто. Теперь, если вы хотите исключить что-либо из этого каталога, это еще одна история...