Хотя ответ Сунила действительно работает, я нашел другой способ, которым, как я думал, я поделюсь.
Я использую методику, изложенную здесь , чтобы получить heat.exe для получения поэтапного вывода моего веб-приложения, но с несколькими изменениями:
<Target Name="BeforeBuild">
<MSBuild Projects="%(ProjectReference.FullPath)" Targets="Package" Properties="Configuration=$(Configuration);Platform=AnyCPU" Condition="'%(ProjectReference.WebProject)'=='True'" />
<Copy SourceFiles="%(ProjectReference.RootDir)%(ProjectReference.Directory)obj\$(Configuration)\TransformWebConfig\transformed\web.config" OverwriteReadOnlyFiles="true" DestinationFolder="%(ProjectReference.RootDir)%(ProjectReference.Directory)obj\$(Configuration)\Package\PackageTmp\" />
<PropertyGroup>
<LinkerBaseInputPaths>%(ProjectReference.RootDir)%(ProjectReference.Directory)obj\$(Configuration)\Package\PackageTmp\</LinkerBaseInputPaths>
</PropertyGroup>
<HeatDirectory OutputFile="%(ProjectReference.Filename)-temp.xml" Directory="%(ProjectReference.RootDir)%(ProjectReference.Directory)obj\$(Configuration)\Package\PackageTmp\" DirectoryRefId="INSTALLLOCATION" ComponentGroupName="%(ProjectReference.Filename)_Project" SuppressCom="true" SuppressFragments="true" SuppressRegistry="true" SuppressRootDirectory="true" AutoGenerateGuids="false" GenerateGuidsNow="true" ToolPath="$(WixToolPath)" Condition="'%(ProjectReference.WebProject)'=='True'" />
<XslTransformation XmlInputPaths="%(ProjectReference.Filename)-temp.xml" XslInputPath="XslTransform.xslt" OutputPaths="%(ProjectReference.Filename).wxs" />
Во-первых, задача копирования захватывает правильно преобразованный файл web.config, который, по-видимому, не происходит сам по себе (я получал токены в файле поэтапной конфигурации).
Задача нагрева выводится во временный XML-файл, который я преобразую через XSLT в файл WXS, чтобы получить WiX
Вот XSLT:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
<xsl:template match="w:Directory[@Name='ExportFiles']/w:Component">
<w:Component>
<xsl:attribute name="Id">
<xsl:value-of select="@Id"/>
</xsl:attribute>
<xsl:attribute name="Guid">
<xsl:value-of select="@Guid"/>
</xsl:attribute>
<w:CreateFolder>
<w:Permission User="Administrators" GenericAll="yes" />
<w:Permission User="Network Service" GenericAll="yes" />
</w:CreateFolder>
<xsl:apply-templates select="*" />
</w:Component>
Он просто воссоздает файл, за исключением папки ExportFiles, в которую добавлены биты прав доступа:
До:
<Directory Id="dirC092054A3A348CC48B696FD466A89A2F" Name="ExportFiles">
<Component Id="cmp699347B0054EDD7DD7B0935D39A66FAE" Guid="{87D70A4F-A757-41C2-8AC9-E2904479FD45}">
<File Id="filEC20935A3F97F24E20E1C2041AC766CA" KeyPath="yes" Source="SourceDir\Reports\ExportFiles\donotdelete.txt" />
</Component>
</Directory>
После того, как:
<Directory Id="dirC092054A3A348CC48B696FD466A89A2F" Name="ExportFiles">
<w:Component Id="cmp699347B0054EDD7DD7B0935D39A66FAE" Guid="{87D70A4F-A757-41C2-8AC9-E2904479FD45}"
xmlns:w="http://schemas.microsoft.com/wix/2006/wi">
<w:CreateFolder>
<w:Permission User="Administrators" GenericAll="yes" />
<w:Permission User="Network Service" GenericAll="yes" />
</w:CreateFolder>
<File Id="filEC20935A3F97F24E20E1C2041AC766CA" KeyPath="yes" Source="SourceDir\Reports\ExportFiles\donotdelete.txt" />
</w:Component>
</Directory>
Это довольно хороший способ делать вещи, и я уже использовал ту же технику для выполнения нескольких других вещей. Надеюсь, кому-то еще это пригодится.