Ищете простой способ включить все файлы в папку проекта BIN в моем MSI - PullRequest
1 голос
/ 03 мая 2019

У меня есть много файлов (сотни) в выходной папке 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>.

Ответы [ 4 ]

1 голос
/ 03 мая 2019

Есть ли способ просто включить все файлы в папку 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()

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

1 голос
/ 04 мая 2019

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

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

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

0 голосов
/ 05 мая 2019

Если вы не говорите о веб-приложении / веб-сайте (подумайте о структуре каталогов 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 голосов
/ 03 мая 2019

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

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

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

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

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

...