【问题标题】:WIX Heat.exe command parameter -var does not accept spaces?WIX Heat.exe 命令参数 -var 不接受空格?
【发布时间】:2013-05-23 05:18:29
【问题描述】:

我有这个 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

我无法更改路径,而且我认为无论如何都没有必要。

我的问题是: 我该如何解决这个问题? (我什至不明白为什么 WIX 在带空格的引用路径/字符串 var 上遇到麻烦)

【问题讨论】:

    标签: visual-studio-2010 visual-studio wix wix3.7


    【解决方案1】:

    要使用热量包含变量及其定义,请使用以下机制。

    1. 创建一个包含 (myinclude.wxi) 文件,您可以在其中定义变量及其值:
    <?xml version="1.0" encoding="utf-8"?>
    <Include> 
      <?define PackageSource="c:\somePath"?>
    </Include>
    
    1. 创建一个 xsl 文件 (mytransform.xsl) 以将 &lt;?include myinclude.wxi?&gt; 添加到 wxs 文件中:
    <?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 转换添加包含语句,并在编译 msi 时使用 wxi 文件中的变量值(稍后使用蜡烛)。

    【讨论】:

    【解决方案2】:

    对于这种情况,您可以在项目属性的 Build 部分定义一个前处理变量,在您的情况下为 PackageSource=Web\obj\$(Configuration)\Package

    并在热调用中引用

    "%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"
    

    【讨论】:

      【解决方案3】:

      -var 开关提供预处理器变量的名称。类似于var.Foo。预处理器变量名称中不能包含空格。值wix.PackageSource=Whatever SolutionDir Expands To\Web\obj\Whatever Configuration Expands To\Package 不是预处理器变量的有效名称,因为其中包含空格。我预计反斜杠也会成为问题。

      【讨论】:

      • 所以,将-var var.PackageSource 传递给加热。它只是将var.PackageSource 写入输出,稍后必须解决。您可以将其绑定到其他命令或 .wxs 文件中的值。
      • 您能描述一下如何做到这一点吗?我尝试将 var 传递给 Heat,然后在另一个 WXS 文件中定义此 var,该文件在 Heat 生成的文件中包含 Heat 文件/引用 ComponentGroup。热文件似乎实际上并未包含在内。它不起作用,只有当我禁用 Heat 并将 var 定义手动放入 Heat 生成的文件中时。
      【解决方案4】:

      所以我最终编写了一些构建事件代码,将必要的定义插入到顶部的 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
      

      【讨论】:

        【解决方案5】:

        我刚刚遇到这个问题,并通过在解决方案文件夹中执行并使用相对路径来解决它。

        这很有效,因为我碰巧在 Jenkins 正在执行的 PowerShell 脚本中运行热量。

        基于以下假设:

        • 使用您的构建方法执行 PowerShell 脚本是合乎情理的
        • PowerShell 脚本位于解决方案目录的文件夹中

        提问者的脚本可能如下所示:

        $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"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-25
          • 1970-01-01
          • 2017-03-22
          • 2013-11-24
          相关资源
          最近更新 更多