如何在.wixproj文件中设置'env'预处理程序变量

问题描述 投票:1回答:2

使用wix工具集,可通过env预处理程序前缀在.wxs文件中访问环境变量,例如

$(env.TestEnvVariable)

我已经配置了构建管道来设置所需的环境变量,并且msi可以很好地构建。但是,您无法再在本地构建.msi,因为在本地开发环境中均未定义任何变量。

我正在使用Visual Studio的wix扩展名,并且我一直在尝试更新.wixproj文件以设置如下属性:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" InitialTargets="EnsureWixToolsetInstalled" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" xmlns:fg="http://www.firegiant.com/schemas/v3/wxs/fgwep.xsd">

  <!-- ... some other bits -->

  <PropertyGroup>
    <TestEnvVariable>TestValue</TestEnvVariable>
  </PropertyGroup>

</Project>

但是当我尝试构建MSI时,出现错误

Undefined preprocessor variable '$(env.TestEnvVariable)'

此外,尝试访问带有'var'前缀的变量时,我收到相同的错误:

Undefined preprocessor variable '$(var.TestEnvVariable)'

我知道您可以使用define constant元素设置'var'样式的预处理器变量

<PropertyGroup>
  <DefineConstants>SomeOtherVariable=someValue</DefineConstants>
</PropertyGroup>

但是在我们的托管管道中,我们将这些变量设置为环境变量,因为这很容易在我们使用的内容(azure devops)中浮出水面。我可以通过重新定义所有“ env”变量将其转换为“ var”,但这似乎不必要地复杂,我想将它们区分为环境变量。我的目标是允许本地开发人员构建使用相同的变量结构,只需在configuration = Debug之类的条件下设置它们即可。

除了有条件地将批处理文件运行到set TestEnvVariable=TestValue之外,没有其他更好的方法来为本地dev设置'env'预处理程序变量吗?

msbuild wix
2个回答
0
投票

经过一会儿睡觉然后踢来跳去,这是我想到的解决方案:我遇到的主要问题是没有完全掌握wix从何处提取环境变量,以及它们如何与.wixproj文件中的MSBuild步骤进行交互。

解决方案是创建一个自定义MSBuild任务,以在构建过程中本地设置环境变量。您可以为此创建一个自定义生成任务.dll,或使用此答案中描述的技术来获取最新版本的MSBuild:https://stackoverflow.com/a/20014410/11908758

基本上,在.wixproj的Project元素中,您需要定义自定义任务:

<UsingTask
  TaskName="SetEnvironmentVariableTask"
  TaskFactory="CodeTaskFactory"
  AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
  <ParameterGroup>
    <Name ParameterType="System.String" Required="true" />
    <Value ParameterType="System.String" Required="true" />
  </ParameterGroup>
  <Task>
    <Using Namespace="System" />
    <Code Type="Fragment" Language="cs">
      <![CDATA[
      Environment.SetEnvironmentVariable(Name, Value);
    ]]>
    </Code>
  </Task>
</UsingTask>

然后,在BeforeBuild目标内部,使用它根据仅适用于本地调试版本的条件设置环境变量。请注意,此任务将仅为调用该任务的目标设置变量,并且该任务将无法在目标元素之外工作

<Target Name="BeforeBuild">
    <!-- Set environment variables for debug build-->
    <SetEnvironmentVariableTask Condition="'$(Configuration)'=='Debug'" Name="MyEnvironmentVariable" Value="Value_for_debug_installer" />
</Target>

然后,您可以在.wxs文件中的某个位置访问它,而不会出现预处理器错误:

<Property Id="PROP_MyProperty" Value="$(env.MyEnvironmentVariable)" />

0
投票

请查看IsWiX的源代码。您将找到一个提取环境变量TF_BUILD_BUILDNUMBER并使用它来设置ProductVersion的示例。

概念是设置一个MSBuild属性,将其作为常量传递给编译器,然后在Product Version属性中使用它。

https://github.com/iswix-llc/iswix-tutorials/blob/master/windows-service/Installer/WindowsService/WindowsService.wixproj

第14,21,27行

https://github.com/iswix-llc/iswix-tutorials/blob/master/windows-service/Installer/WindowsService/Code/Product.wxs

第11行

© www.soinside.com 2019 - 2024. All rights reserved.