【问题标题】:msbuild, how to set environment variables?msbuild,如何设置环境变量?
【发布时间】:2026-02-03 01:20:03
【问题描述】:

我正在尝试使用项目文件(例如 .vcxproj)设置环境变量

我查看了属性函数,但它似乎没有这样的功能。

我知道有一种方法可以检索环境变量,但找不到如何设置它。

我觉得应该有办法在项目文件中设置环境变量。

【问题讨论】:

    标签: visual-c++ msbuild


    【解决方案1】:

    从 MSBuild v4.0 起,编码任务可以直接放在项目文件中。像这样:

    <UsingTask
      TaskName="SetEnvironmentVariableTask"
      TaskFactory="CodeTaskFactory"
      AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v$(MSBuildToolsVersion).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>
    

    请注意,在 MSBuild 14+ 中,AssemblyFile 引用应该是:

    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll"
    

    然后可以从目标中使用SetEnvironmentVariableTask

    <Target Name="SampleTarget" BeforeTargets="Build">
      <SetEnvironmentVariableTask Name="TEST_ENV_VAR" Value="$(MSBuildProjectName)" />
    </Target>
    

    这比为小型 MSBuild 任务编写单独的 .DLL 要方便得多。

    【讨论】:

    • 尽我所能,我无法让它与 Visual Studio 2012 一起使用。但是,我找到了解决方案 here
    • 尝试 Environment.SetEnvironmentVariable(Name, Value, EnvironmentVariableTarget.Machine) 或 Environment.SetEnvironmentVariable(Name, Value, EnvironmentVariableTarget.User)。默认为 Environment.SetEnvironmentVariable(Name, Value, EnvironmentVariableTarget.Process)
    • 我的经验是,虽然我可以设置环境变量,但我必须关闭/重新打开 VS2013 才能看到变化。
    • 请注意,在 MSBuild 14 中,AssemblyFile 引用应该是:AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll"&gt;
    • 如果在 .NET Core 上使用 msbuild,则必须改用 RoslynCodeTaskFactory。它从 MSBuild 15.8 开始可用。有些任务只需将CodeTaskFactory 替换为RoslynCodeTaskFactory 即可工作。
    【解决方案2】:

    有几点:

    1. 如果您只在 MSBuild 的上下文中使用变量,那么您可以只使用标准的 MSBuild 变量,而不是尝试设置环境变量

    2. 如果确实需要设置环境变量,那么这不是开箱即用的东西。您需要编写一个自定义任务,然后在项目文件中使用它。这是 MSDN 主题的链接,其中概述了如何执行此操作。
      How to set envrionment variables in MSBuild file?

    【讨论】:

    • 请附上代码示例,链接不可信
    【解决方案3】:

    您可以考虑将环境变量作为 SET XXX=$(XXX) 行的序列写入文本文件 (.cmd)。然后在命令窗口执行.cmd。

    例如使用所有 SET 命令定义一个 ItemGroup,然后使用任务“WriteLinesToFile”将每个项目写入 .cmd 文本文件中的一行。

    <ItemGroup>
      <BuildEnvItem Include="REM This file is auto generated. Do not edit" />
      <BuildEnvItem Include="SET TEST_ENV_VAR=$(TEST_ENV_VAR)" />
      <!-- add more as needed -->
    <ItemGroup>
    
    <Target Name="DefineBuildEnvironmentVariables">
        <WriteLinesToFile File="Build_env.cmd" Lines="@(BuildEnvItem)" Overwrite="true" Encoding="Unicode"/>
    </Target>
    

    这在存在使用 msbuild 的现有 .cmd 的情况下可能很有用。初始 .cmd 使用 msbuild 生成 Build_env.cmd,然后在继续之前调用 Build_env.cmd。

    【讨论】:

      【解决方案4】:

      在最新版本的 MS Build (since 2016) 中,您可以简单地执行以下操作:

      <Target Name="MyEnvironmentVariables">
          <Exec Command="A command that needs environment variables" EnvironmentVariables="HANDY_ENV_VAR_1=500;HANDY_ENV_VAR_2=A Useful Value"  />
      </Target>
      

      确保用分号分隔变量。不过,您不需要尾随分号。

      【讨论】: