27

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

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

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

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

4

4 回答 4

36

自 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 要方便得多。

于 2013-11-16T03:44:44.737 回答
6

有几件事:

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

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

于 2013-01-11T03:41:50.163 回答
2

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

例如,使用所有 SET 命令定义一个 ItemGroup,然后使用 Task '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。

于 2016-03-01T00:51:49.120 回答
1

在最新版本的 MS Build(自 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>

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

于 2021-08-19T15:30:52.447 回答