У меня есть много файлов (сотни) в выходной папке BIN моего проекта. Мне просто нужно иметь установщик, чтобы включить файлы в папку bin в установщик MSI.

В моем проекте установки WIX у меня есть следующая цель - использовать инструмент сбора урожая и создать список всех файлов в папке bin, позже я буду ссылаться на них в своих определениях WIX:

  <Target Name="GenerateHeat">
    <HeatDirectory Directory="..\MyApp\bin\Debug" 
       PreprocessorVariable="var.HeatPath" OutputFile="HarvestedFiles.wxs"
       ComponentGroupName="HarvestedFiles" DirectoryRefId="FOLDER1" 
       AutogenerateGuids="true" ToolPath="$(WixToolPath)" 
       SuppressFragments="true" SuppressRegistry="true" SuppressRootDirectory="true" />
  </Target>

Есть ли способ просто включить все файлы в папку bin и включить их в MSI, не создавая список промежуточных файлов? Я предпочитаю указывать имя папки BIN, и WIX включает их в <ComponentGroup>, поэтому я могу ссылаться на него в своем <Product>

Обновление и уточнение

Этот вопрос не о том, как работает MSI. Это о том, как WIX может копировать содержимое папки в MSI без указания каждого имени файла в сэндвиче <Component> и <File>.

2
Allan Xu 3 Май 2019 в 04:29

4 ответа

Лучший ответ

Есть ли способ просто включить все файлы в папку bin и включить их в MSI, не создавая список промежуточных файлов?

Это невозможно со встроенной функциональностью бесплатной версии WiX. Как отмечает Стейн Осмул , в коммерческой ветви WiX может быть что-то подобное.

Если коммерческий WiX не подходит, и вы готовы потратить значительное время на разработку на C #, используя в основном недокументированный API, вы можете написать расширение компилятора WiX, добавляющее записи в файл и Компонент таблицы на основе заданного пути к исходному каталогу. Он также может генерировать группы компонентов, на которые можно ссылаться в других местах.

Я делал именно это в прошлом, но это, конечно, не было тривиальной задачей. Нужно также очень хорошо знать правила компонентов и MSI в целом, прежде чем делать такие вещи, как генерация GUID компонентов. Вы найдете псевдокод ниже. Прежде чем идти по этому пути, стоило бы осмотреться, если бы кто-то еще создал такое расширение WiX с открытым исходным кодом.

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

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:ex="MyExtensionUri">
  <Product ... >
    <Feature Id="ProductFeature" Title="MyFeature" Level="1">
      <ComponentGroupRef Id="ProductComponents" />
    </Feature>
  </Product>

  <Fragment>
    <ex:ComponentGroupFromFiles Id="ProductComponents"
      Directory="INSTALLFOLDER"
      Source="MyApp\bin"
      Wildcard="*"/>
  </Fragment>
</Wix>

Вот некоторый псевдокод для расширения компилятора. Это в основном предназначено для использования в качестве ключевых слов для изучения источника WiX "Compiler.cs " .

Переопределите Wix.CompilerExtension.ParseElement(), чтобы проанализировать атрибуты вашего элемента расширения.

Создайте группу компонентов и свяжите ее с продуктом:

Wix.Row compGroupRow = Core.CreateRow(sourceLineNumbers, "WixComponentGroup");
compGroupRow[0] = myComponentGroupId;

Core.CreateWixGroupRow( sourceLineNumbers, Wix.ComplexReferenceParentType.Product, Core.ActiveSection.Id, Wix.ComplexReferenceChildType.ComponentGroup, myComponentGroupId );

Для каждого компонента / файла:

// Add record to the Component table
Wix.Row compRow = Core.CreateRow( sourceLineNumbers, "Component" );
// TODO: Assign data to compRow[0..5] according to MSI "Component" table documentation

// Add this component to the component group.
Core.CreateComplexReference( sourceLineNumbers, Wix.ComplexReferenceParentType.ComponentGroup, myComponentGroupId, "", Wix.ComplexReferenceChildType.Component, myComponentId, false );

// Add record to the File table.
Wix.Row fileRow = Core.CreateRow( sourceLineNumbers, "File" );
// TODO: Assign data to fileRow[0..2] and [6] according to MSI "File" table documentation. Columns 3, 4, 5, 7 are written by the WiX binder at a later time! Set them to null (if nullable) or 0.

// Create required metadata for WiX
Wix.WixFileRow wixFileRow = (Wix.WixFileRow) Core.CreateRow(sourceLineNumbers, "WixFile");
// TODO: Assign wixFileRow.File, wixFileRow.Directory, wixFileRow.DiskId, wixFileRow.Source
//       Set wixFileRow.Attributes to 1 if you have generated a short file name.

// Add reference to the Media table
Core.CreateWixSimpleReferenceRow( sourceLineNumbers, "Media", diskId );

Полезные утилиты для генерации данных столбцов таблицы компонентов / файлов:

Core.GenerateIdentifier()
Core.GenerateShortName()

Как добавить компоненты в модуль слияния? Это оставлено в качестве упражнения для читателя. 😉 Просто найдите код в WiX "

zett42 6 Май 2019 в 12:40

FireGiant : я полагаю, что коммерческая отрасль WiX (FireGiant ), есть модуль для этого. Сбор тепловой энергии или что-то в этом роде. Он является частью пакета расширения WiX если не ошибаюсь. Это позволяет выполнять расширенный сбор данных для создания файлов MSI и, возможно, других форматов, о которых я не знаю. Я почти ничего не знаю о модуле, кроме этого. О, он также поддерживает извлечение COM из 64-битных файлов COM - который в настоящее время не работает в heat.exe.

Tallow . Еще во времена WiX2 существовал инструмент под названием Tallow, разработанный кем-то, чье имя я не могу вспомнить. Он генерировал разметку WiX для установки файлов из заданной входной папки и даже синхронизировал GUID компонентов (насколько я помню). Я видел несколько его копий на github.com, но в загруженном репозитории было несколько попаданий вредоносного ПО, поэтому ссылки отсутствуют.

Парафин . Инструмент, который я никогда не использовал, - это Парафин - предположительно, лучший жир - https://github.com/Wintellect/Paraffin. Я не могу сказать много об этом, так как я не пробовал это. Дай это быстрый взгляд? Честно говоря, я не уверен, поддерживается ли он вообще, но это, безусловно, лучше, чем готовить собственное решение с нуля.

1
Stein Åsmul 3 Май 2019 в 21:47

Это было бы против всей концепции дизайна установщика Windows.

Установщик Windows управляет состоянием / состоянием установки компонентов. Это происходит во всех версиях всех установленных продуктов. Чтобы сделать это работоспособным, есть Правила для компонентов « . Чтобы сделать правила управляемыми в течение жизненного цикла компонента, компонент должен быть атомарным: один файл (или многофайловая сборка .NET) и / или раздел реестра.

(Если у вас есть выбор, вам не нужно использовать установщик Windows, если вы не цените его дизайн.)

Кроме того, вы должны подумать, следует ли устанавливать, как и где все, что находится в вашей папке bin. Его основное предназначение - отладка на месте. Он может содержать информацию о том, что 1) у вас нет лицензии на перераспределение, 2) у вас есть лицензия на перераспределение только особым образом, 3) возможно, она уже является частью целевых систем, 4) может быть лучше всего распространена с их исходным установщиком из продавец 5) вы на самом деле не хотите доставлять пользователям… В связи с этим вы можете сузить сбор урожая или отфильтровать конкретные результаты.

Совет: Если вы хотите модульно выполнить установку, вы можете собрать наборы компонентов в разные файлы MSI и использовать загрузчик WiX для их совместной установки.

0
Tom Blodget 3 Май 2019 в 11:51

Если вы не говорите о веб-приложении / веб-сайте (подумайте о структуре каталогов node.js), я рекомендую против этого.

Для какого-то менеджера пакетов я создал все эти тысячи файлов для меня (^^^), а затем использую Heat.

Для всех других нормальных сценариев я создал IsWiX. Это помогает мне уменьшить сложность и трение в создании / обслуживании инсталляторов, в то же время сохраняя контроль над тем, что доставляется / не доставляется, а также когда что-то устанавливается или не устанавливается (функции).

https://iswix.com/2007/06/20/dealing-with-very-large-number-of-files/

https://github.com/iswix-llc/iswix-tutorials

0
Christopher Painter 5 Май 2019 в 02:51