Msbuild 如何设置';环境';.wixproj文件中的预处理器变量
使用wix工具集,可以通过env预处理器前缀在.wxs文件中访问环境变量,例如Msbuild 如何设置';环境';.wixproj文件中的预处理器变量,msbuild,wix,Msbuild,Wix,使用wix工具集,可以通过env预处理器前缀在.wxs文件中访问环境变量,例如 $(env.TestEnvVariable) 我已经配置了构建管道来设置所需的环境变量,msi构建良好。但是,您不能再在本地构建.msi,因为没有任何变量是在本地开发环境中定义的 我正在使用visual studio的wix扩展,并且我一直在尝试更新我的.wixproj文件以设置如下属性: <?xml version="1.0" encoding="utf-8"?> <Project ToolsV
$(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>
但在我们的托管管道中,我们将这些变量设置为环境变量,因为这在我们使用的(azure devops)中很容易出现。我可以通过重新定义所有这些“env”变量,将它们转换为“var”,但这似乎不必要地复杂,我希望保持它们作为环境变量的区别。我的目标是允许本地开发人员构建使用相同的变量结构,只需在configuration=Debug之类的条件下设置它们
除了有条件地将批处理文件运行到
set TestEnvVariable=TestValue
,没有更好的方法为本地开发人员设置“env”预处理器变量了吗?好了,在对其进行了一些思考之后,我找到了以下解决方案:
我遇到的主要问题是没有完全理解wix从何处提取环境变量,以及环境变量如何与.wixproj文件中的MSBuild步骤交互
解决方案是创建自定义MSBuild任务,以便在生成期间在本地设置环境变量。您可以为此创建自定义生成任务.dll,也可以使用此答案中描述的技术来获取更当前版本的MSBuild:
基本上,在.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目标内,使用它根据仅对本地调试生成为true的条件设置环境变量。请注意,此任务将仅为调用该任务的目标设置变量,并且该任务将不会在目标元素之外工作:
<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属性,将其作为常量传递给编译器,然后在产品版本属性中使用它 第14、21、27行 第11行
<Property Id="PROP_MyProperty" Value="$(env.MyEnvironmentVariable)" />