6

多くの機能を含むインストーラーを構築しようとしています。各機能のファイルのディレクトリを取得するためにheatを使用しています。
私のソース ディレクトリ構造は次のようになります。

HarvestDir
          \FeatureA
                   \FeatureImpl.dll
                   \FeatureImpl2.dll
          \FeatureB
                   \FeatureImpl.dll
                   \FeatureImpl2.dll

したがって、機能ごとにheat.exeを実行して各機能のフラグメントを作成しますが、基本的に同一のフラグメントを取得します。

[...] Source="SourceDir\FeatureImpl.dll"
[...] Source="SourceDir\FeatureImpl2.dll"

私が本当に欲しいのは次のようなものです:

[...] Source="SourceDir\FeatureA\FeatureImpl.dll"
[...] Source="SourceDir\FeatureA\FeatureImpl2.dll"

[...] Source="SourceDir\FeatureB\FeatureImpl.dll"
[...] Source="SourceDir\FeatureB\FeatureImpl2.dll"

-varを使用して、各機能のソースの場所を表す個別の変数を指定できますが、これらの変数の値を wixproj に渡す必要があります (約 10 個の機能が必要です)。

それで、収穫したフラグメントに相対パスを含める方法はありますか?

4

3 に答える 3

3

heat各フォルダーで使用するのではなく、Feature*作成したフィーチャ レイアウト フォルダー全体を取得してheat、結果を変換することができます。各サブフォルダーが機能であると想定しています。ComponentGroupその下にあるすべてのコンポーネントを参照する for eachを作成するのは簡単なことです。

次に、次のようにコンポーネント グループを使用します。

    <Feature Id="FeatureA">
      <ComponentGroupRef Id="FeatureA"/>
    </Feature>
    <Feature Id="FeatureB">
      <ComponentGroupRef Id="FeatureB"/>
    </Feature>

Heat コマンド (私は実際に WiX 3.7 で HarvestDirectory ターゲットを使用しています):

Heat.exe dir FeatureLayout -dr FeatureLayoutDir -srd -ag -sfrag -t FeatureLayout.xslt -out obj\Debug\__dir.wxs

FeatureLayout.xslt:

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

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

  <xsl:template match="wix:Wix">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
      <xsl:for-each select="wix:Fragment/wix:DirectoryRef/wix:Directory">
        <wix:Fragment>
          <wix:ComponentGroup Id="{@Name}">
            <xsl:for-each select="descendant::wix:Component">
              <wix:ComponentRef Id="{@Id}"/>
            </xsl:for-each>
          </wix:ComponentGroup>
        </wix:Fragment>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
于 2013-06-17T17:15:27.100 に答える
1

DefineConstants の .wixproj でソース パスを割り当てるか、WIX インクルード ファイルでそれらを割り当てることができますが、どちらの方法でも、「var」オプションを使用して、ソースに使用される変数を指定する必要があります。

Wixproj で DefineConstant を使用する場合は、次のようにする必要があります。

        <Target Name="BeforeBuild">
            <PropertyGroup>
              <DefineConstants>BINFOLDER=..\PATH\TO\SOURCE\$(Configuration)</DefineConstants>
            </PropertyGroup>    
            <HeatDirectory OutputFile="output.wxs" Directory="..\PATH\TO\SOURCE\$(Configuration)" DirectoryRefId="INSTALLFOLDER" ComponentGroupName="COMPONENTGROUPNAME" ToolPath="$(WixToolPath)" PreprocessorVariable="var.BINFOLDER" />    
        </Target>

Heat タスクでは、必要な追加の属性を必ず追加してください。ソース プロジェクトへの参照を .wixproj に追加した場合は、「PreprocessorVariable」属性でプロジェクト参照変数を直接使用できます。たとえば、var.BINFOLDER の代わりに var.MyProject.TargetDir を使用します。

WIX インクルード ファイル (.wxi) を使用する場合は、Variables.wxi などのインクルード ファイルで変数を宣言します。

        <?xml version="1.0" encoding="UTF-8"?>
        <Include>
          <?define PATH1="PATH\TO\SOURCE"?>
          <?define PATH2="$(var.PATH1)\$(Configuration)"?>
        </Include>

ここで、heat コマンド ラインで -var を使用して PATH1 と PATH2 を渡す必要があります。.wxs ファイルを取得したら、Variables.wxi ファイルをその中に含める必要があります。

<?include Variables.wxi ?>

あなたの.wxsで。この方法の問題点は、WIX ソース ファイルを生成するたびにこの include ディレクティブを手動で追加するか、XSL Transformation を使用して挿入する必要があることです。

于 2013-06-14T13:43:24.137 に答える