web-dev-qa-db-ja.com

Wixツールセットでファイルを除外する方法

Heat.exeのファイルを収集している間、最初にフォルダー内のすべてのファイルをフェッチするため、入力フォルダーから拡張子.exeのファイルを除外します。

以下は私のコードです。

"%WIX_PATH%\ Heat.exe" dir "%input_folder%" -cg SourceProjectComponents -dr INSTALLLOCATION -scom -sreg -srd -var var.BasePath -gg -sfrag -var var.BasePath -out "%output_folder%\ Output。 wxs」

PS:input_folderは、いくつかの.dllファイルと.exeファイルで構成されています。したがって、ファイルを個別に収集することはできませんでした。

前もって感謝します。

13
try_cod

XSLT変換を使用する必要があります。

このようなものがうまくいくはずです。コマンドラインに-t <Path to the xslt file>を含めるだけで、熱が発生します。

このXSLTは、ノードが<Component>要素と.exe<File>要素を持つ場合を除き、入力のすべてのXMLノードを含む新しいXMLファイルを出力します。

RemoveExeComponentsTransform.xslt

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:wix="http://schemas.Microsoft.com/wix/2006/wi"
    xmlns="http://schemas.Microsoft.com/wix/2006/wi"

    version="1.0" 
    exclude-result-prefixes="xsl wix"
>

    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />

    <xsl:strip-space elements="*" />

    <!--
    Find all <Component> elements with <File> elements with Source="" attributes ending in ".exe" and tag it with the "ExeToRemove" key.

    <Component Id="cmpSYYKP6B1M7WSD5KLEQ7PZW4YLOPYG61L" Directory="INSTALLDIR" Guid="*">
        <File Id="filKUS7ZRMJ0AOKDU6ATYY6IRUSR2ECPDFO" KeyPath="yes" Source="!(wix.StagingAreaPath)\ProofOfPEqualsNP.exe" />
    </Component>

    Because WiX's Heat.exe only supports XSLT 1.0 and not XSLT 2.0 we cannot use `ends-with( haystack, needle )` (e.g. `ends-with( wix:File/@Source, '.exe' )`...
    ...but we can use this longer `substring` expression instead (see https://github.com/wixtoolset/issues/issues/5609 )
    -->
    <xsl:key
        name="ExeToRemove"
        match="wix:Component[ substring( wix:File/@Source, string-length( wix:File/@Source ) - 3 ) = '.exe' ]"
        use="@Id"
    /> <!-- Get the last 4 characters of a string using `substring( s, len(s) - 3 )`, it uses -3 and not -4 because XSLT uses 1-based indexes, not 0-based indexes. -->

    <!-- We can also remove .pdb files too, for example: -->
    <xsl:key
        name="PdbToRemove"
        match="wix:Component[ substring( wix:File/@Source, string-length( wix:File/@Source ) - 3 ) = '.pdb' ]"
        use="@Id"
    />

    <!-- By default, copy all elements and nodes into the output... -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

    <!-- ...but if the element has the "ExeToRemove" key then don't render anything (i.e. removing it from the output) -->
    <xsl:template match="*[ self::wix:Component or self::wix:ComponentRef ][ key( 'ExeToRemove', @Id ) ]" />

    <xsl:template match="*[ self::wix:Component or self::wix:ComponentRef ][ key( 'PdbToRemove', @Id ) ]" />

</xsl:stylesheet>
20

プロジェクトのWXSファイルに含める必要のあるファイルがたくさんあるのと同じ問題があり、フォルダー、拡張子、ファイルなどを無視しながら、ディレクトリ構造、ファイル、コンポーネントのXMLを生成するオープンソースのコマンドラインアプリケーションを作成しました.wixignoreファイル(.gitignoreと同様の形式)を介して。

It here をご覧ください。

2
Murat Aykanat

WiXツールセット4.0を使用している場合:

Xslフィルターは、正しい名前空間(xmlns:wix="http://wixtoolset.org/schemas/v4/wxs")を設定するまで機能しません。3.11から4.0にアップグレードする状況で、フィルターが機能しない理由を見つけるのに何時間もかかりました。 VSソリューションまたはコマンドライン(heat.exe)バージョンのいずれか。

これが誰かを助けることを願っています

1
Iulian M.