使用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'预处理程序变量吗?
经过一会儿睡觉然后踢来跳去,这是我想到的解决方案:我遇到的主要问题是没有完全掌握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)" />
请查看IsWiX的源代码。您将找到一个提取环境变量TF_BUILD_BUILDNUMBER并使用它来设置ProductVersion的示例。
概念是设置一个MSBuild属性,将其作为常量传递给编译器,然后在Product Version属性中使用它。
第14,21,27行
第11行