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