6

すべての不変パスを使用するこの WIX コマンドがあり、システム環境は必要ありません (この例とは異なります http://weblogs.sqlteam.com/mladenp/archive/2010/02/23/WiX-3-Tutorial-Generating -filedirectory-fragments-with-Heat.exe.aspx ):

"%wix%bin\heat.exe" dir "$(SolutionDir)Web\obj\$(Configuration)\Package" 
                    -cg PACKAGEFILES -gg -g1 -sreg -srd -dr DEPLOYFOLDER 
                    -var wix.PackageSource="$(SolutionDir)Web\obj\$(Configuration)\Package"
                    -out "$(SolutionDir)WebInstaller\PackageFragment.wxs"

ソリューション パスにスペースが含まれており、このエラーがスローされるビルド サーバーを除いて、うまく機能します。

heat.exe エラー HEAT5057: スイッチ '-var' は値からのスペースを許可しません。値からスペースを削除してください: wix.PackageSource=C:\Build\Builds 1\26e27895ae75b7cb\CADPortal\src\trunk\Web\obj\Debug\Package

私はパスを変更することはできませんし、私の意見ではとにかく必要ではありません。

私の質問は次のとおりです。どうすればこれを解決できますか? (スペースを含む引用符で囲まれたパス/文字列 var で WIX が問題を起こしている理由さえわかりません)

4

5 に答える 5

8

heat を使用して変数とその定義を含めるには、次のメカニズムを使用します。

  1. 変数とその値を定義するインクルード (myinclude.wxi) ファイルを作成します。
<?xml version="1.0" encoding="utf-8"?>
<Include> 
  <?define PackageSource="c:\somePath"?>
</Include>
  1. を wxs ファイルに追加するための xsl ファイル (mytransform.xsl) を作成し<?include myinclude.wxi?>ます。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wix="http://schemas.microsoft.com/wix/2006/wi">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

  <xsl:template match="wix:Wix">
    <xsl:copy>
      <xsl:processing-instruction name="include">myInclude.wxi</xsl:processing-instruction>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <!-- Identity transform. -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
  1. heat を実行し、変換を指す -t パラメーターを指定します。

    heat.exe dir "c:\somePath" -cg PACKAGEFILES -gg -g1 -sreg -srd -dr DEPLOYFOLDER -var PackageSource -t mytransform.xsl -out PackageFragment.wxs

これにより、意図したとおりに PackageFragment.wxs ファイルが作成され、xsl 変換を使用して include ステートメントが追加され、msi をコンパイルするときに wxi ファイルの変数値が使用されます (後でキャンドルを使用します)。

于 2015-04-28T21:17:52.053 に答える
3

-varスイッチは、プリプロセッサ変数の名前を提供します。のようなものvar.Foo。プリプロセッサ変数名にスペースを含めることはできません。値wix.PackageSource=Whatever SolutionDir Expands To\Web\obj\Whatever Configuration Expands To\Packageにはスペースが含まれているため、プリプロセッサ変数の有効な名前ではありません。バックスラッシュも問題になると思います。

于 2013-05-28T15:26:30.210 に答える
2

そのため、必要な定義を Heat 生成ファイルの先頭に挿入するビルド イベント コードをコーディングすることになりましたが、開始 WIX タグの下にあります。個人的には、この種の悪ふざけやハッキングを行う必要がある場合、WIX の威力に疑問を持ち始めています。

とにかく、これは必要な人のための完全なビルド イベント コードです。(また、MSBuild.exe の不変パスが検出され、Web パッケージが作成されます。)

echo off

set THEME_REGKEY=HKLM\Software\Microsoft\MSBuild\4.0
set THEME_REGVAL=MSBuildOverrideTasksPath

REM Check for presence of key first.
reg query %THEME_REGKEY% /v %THEME_REGVAL% 2>nul || (echo No theme name present! & exit /b 1)

REM query the value. pipe it through findstr in order to find the matching line that has the value. only grab token 3 and the remainder of the line. %%b is what we are interested in here.
set THEME_NAME=
for /f "tokens=2,*" %%a in ('reg query %THEME_REGKEY% /v %THEME_REGVAL% ^| findstr %THEME_REGVAL%') do (
    set THEME_NAME=%%b
)

REM Possibly no value set
if not defined THEME_NAME (echo No theme name present! & exit /b 1)

REM replace any spaces with +
set THEME_NAME=%THEME_NAME: =+%

if errorlevel 1 goto BuildEventFailed
%THEME_NAME%MSBuild  "$(SolutionDir)Web\Web.csproj" /t:Build;Package /p:Configuration=$(Configuration)
if errorlevel 1 goto BuildEventFailed

"%wix%bin\heat.exe" dir "$(SolutionDir)Web\obj\$(Configuration)\Package" -cg PACKAGEFILES -gg -g1 -sreg -srd -dr DEPLOYFOLDER -var var.PackageSource -out "$(SolutionDir)WebInstaller\PackageFragment.wxs"

REM FUNC "HeatFix" - This inserts the var. definition in top of the heat generated fragment:
 MOVE /Y "$(SolutionDir)WebInstaller\PackageFragment.wxs" temp.txt
(
  FOR /F "tokens=*" %%A IN (temp.txt) DO (
    ECHO %%A
    IF "%%A" EQU "<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">" (
      ECHO ^<^?define PackageSource^=^"$(SolutionDir)Web\obj\$(Configuration)\Package^"^?^>
    )
  )
) > "$(SolutionDir)WebInstaller\temp.txt"
move /Y "$(SolutionDir)WebInstaller\temp.txt" "$(SolutionDir)WebInstaller\PackageFragment.wxs"
REM END FUNC "HeatFix"

goto BuildEventOK
:BuildEventFailed
echo POSTBUILDSTEP for $(ProjectName) FAILED
exit 1
:BuildEventOK
echo POSTBUILDSTEP for $(ProjectName) COMPLETED OK
于 2013-05-31T09:25:58.577 に答える
0

この問題に遭遇し、ソリューション フォルダーで実行し、相対パスを使用して解決しました。

これは、Jenkins が実行している PowerShell スクリプト内でたまたまヒートを実行しているためです。

以下の仮定に基づいています。

  • PowerShell スクリプトの実行は、ビルド方法に適しています
  • PowerShell スクリプトは、ソリューション ディレクトリのフォルダー内に存在します。

Question Asker のスクリプトは次のようになります。

$SolutionDir = (get-item $PSScriptRoot).Parent.FullName
Set-Location $SolutionDir
& $env:WIX\bin\heat.exe" dir "$SolutionDir\Web\obj\$(Configuration)\Package" 
    -cg PACKAGEFILES -gg -g1 -sreg -srd -dr DEPLOYFOLDER 
    -var wix.PackageSource=".\Web\obj\$(Configuration)\Package"
    -out "$SolutionDir\WebInstaller\PackageFragment.wxs"
于 2021-08-05T17:47:59.923 に答える