msbuild 引用一个环境变量

Posted

技术标签:

【中文标题】msbuild 引用一个环境变量【英文标题】:msbuild refer to a env variable 【发布时间】:2021-06-18 06:53:19 【问题描述】:

为了自动化构建,我使用了一个带有路径环境变量名称的 props 文件,该路径环境变量可能(或可能不)在计算机中。 (希望以后能加个条件)

我的 props 文件是这样的:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <MyVersion>EnvVarPath</MyVersion>
  </PropertyGroup>
</Project>

然后我在我的 csproj 文件中导入该道具文件并使用复制任务复制文件尝试使用 $(MyVersion) ,如下所示:

  <Target Name="Copy1File" AfterTargets="Build">
    <Message Text="$(MyVersion)" Importance="high" />
    <Copy
      SourceFiles="$(ProjectDir)File.xml"
      DestinationFolder="$(MyVersion)folder\File.xml"
    />

MyVersion var 计算结果为“EnvVarPath”字符串,但不是 env 变量的值。我也尝试在 props 文件中使用 %EnvVarPath%,但它的计算结果也为“%EnvVarPath%”(可以复制到文件资源管理器并工作),但不计算为 msbuild 的路径本身。

如何在我的构建中获得该路径值?

【问题讨论】:

尝试删除&lt;MyVersion&gt;EnvVarPath&lt;/MyVersion&gt;,因为它实际上覆盖了变量值。 感谢@VladimirSerykh,但如果我删除它,我无法自动化我需要更改每个版本的 env 版本,所以很遗憾,这不是一个选项 所有环境变量都作为属性公开。所以你不能只做&lt;MyVersion&gt;$(EnvVarPath)&lt;/MyVersion&gt; 还是我错过了什么?如果确实有必要,您也可以在命令行/p:MyVersion=%EnvVarPath% 上传递参数,但不应该 谢谢pinkfloydx33。 xxxx是我自动化和更改每个版本的东西,所以很遗憾我不能使用 env 变量。 【参考方案1】:

正如 cmets 中提到的,所有环境变量都自动作为属性提供 - 所以$(windir) 应该提供 Windows 系统上 windows 目录的路径。

由于添加的间接或环境变量名称在 MSBuild XML 中无效(例如 ProgramFiles(x86)),这可能并不总是可以使用内联,因此 System.Environment 上的必要静态方法已在 MSBuild 中被白化,并且可以这样使用:

<PropertyGroup>
  <ProgramFilesVarPrefix>ProgramFiles</ProgramFilesVarPrefix>
  <ProgramFilesVarSuffix>(x86)</ProgramFilesVarSuffix>
  <ProgramFilesLocation>$([System.Environment]::GetEnvironmentVariable('$(ProgramFilesVarPrefix)$(ProgramFilesVarSuffix)'))</ProgramFilesLocation>
</PropertyGroup>

评估结果(如 MSBuild 结构化日志查看器中所示):

【讨论】:

以上是关于msbuild 引用一个环境变量的主要内容,如果未能解决你的问题,请参考以下文章

msbuild、dotnet sdks、azure、kudu等使用的环境变量列表

Makefile中要引用一个系统环境变量该怎么办

Makefile引用与环境变量

yml文件中引用系统环境变量

通过从perl脚本调用的批处理文件设置环境变量

如何使用 MSBuild 引用不同版本的 dll