【问题标题】:How do I reference a variable at the command line using light.exe in WiX如何在 WiX 中使用 light.exe 在命令行中引用变量
【发布时间】:2019-10-22 22:01:49
【问题描述】:

我已经阅读了似乎暗示能够在命令行(this one being the most obvious) 中引用绑定或 WiX 变量的参考资料。这将使我能够将程序集信息添加到生成的 MSI 的名称中。例如,

light.exe ... -out Installer.!(bind.FileVersion.myExe).msi ...
light.exe ... -out Installer.!(wix.BlahInfo).msi ...

肯定有一些验证正在进行。如果 WXS 文件和 light.exe 命令中的引用之间的 WixVariable ID 名称不同,我会收到错误消息:

light.exe : error LGHT0197 : The Windows Installer XML variable !(wix.BlahInfo1) is unknown

如果我确保它们匹配,那么错误就会消失:

<WixVariable Id="BlahInfo" Value='!(bind.FileVersion.myExe)'/>
light.exe ... -out Installer.!(wix.BlahInfo).msi ...

但是,无论我尝试什么,生成的 MSI 文件都不会执行运行时变量替换。相反,它只是将 !(...) 添加到文件名中。举个例子,我上次的构建生成了一个具有以下名称的文件:

Installer.!(wix.BlahInfo).msi

这是可以做到的还是我误解了文档?谢谢。

【问题讨论】:

    标签: wix windows-installer


    【解决方案1】:

    Light 不支持命令行上的绑定时变量引用。

    【讨论】:

      【解决方案2】:

      所以我得出了和鲍勃一样的结论。这是不可接受的,因为它在构建中引入了太多的可变性,所以我以不同的方式解决了它。我知道在命令行运行的可执行文件可以在运行时引用 Windows 环境变量。所以我需要做的就是设置一个环境变量并引用它,瞧:

      light.exe ... -out Installer.%BLAH_VERSION%.msi
      

      要实现这一点,需要完成很多工作。首先,我的版本号来自 Visual Studio 项目的程序集信息。我必须做的第一件事是让它动态化,以便它为每个构建创建一个新的。将最后 2 个数字更改为 * 就是这样做的:

      [assembly: AssemblyVersion("6.4.*")]
      

      接下来要做的是将该数字外部化,以便可以在其他地方使用。将此节添加到 csproj 的末尾即可:

      <Target Name="PostBuildMacros">
        <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
          <Output TaskParameter="Assemblies" ItemName="Targets" />
        </GetAssemblyIdentity>
        <ItemGroup>
          <VersionNumber Include="@(Targets->'%(Version)')"/>
        </ItemGroup>
      </Target>
      <PropertyGroup>
        <PostBuildEventDependsOn>
          $(PostBuildEventDependsOn);
          PostBuildMacros;
        </PostBuildEventDependsOn>    
        <PostBuildEvent>setx BLAH_VERSION @(VersionNumber)</PostBuildEvent>
      </PropertyGroup>
      

      Thanks to this stackoverflow post for help.

      当然要引用它,我需要找到一种方法来获取已打开的命令提示符以更新其对环境变量的引用。 This proved to be the most difficult, but this stackoverflow post came to the rescue.

      所以现在我已经使用 Windows 批处理脚本将它们绑定在一起了。从本质上讲,我构建了 EXE,对其进行测试,确保它是好的,运行我的批处理脚本,我有一个以为我生成的程序集信息版本命名的 MSI 文件。

      【讨论】:

        猜你喜欢
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-09
        • 2016-09-25
        • 2022-01-08
        • 2015-11-15
        • 1970-01-01
        相关资源
        最近更新 更多