Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Msbuild 如何设置';环境';.wixproj文件中的预处理器变量_Msbuild_Wix - Fatal编程技术网

Msbuild 如何设置';环境';.wixproj文件中的预处理器变量

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

使用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>

但在我们的托管管道中,我们将这些变量设置为环境变量,因为这在我们使用的(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)" />