【问题标题】:msbuild refer to a env variablemsbuild 引用一个环境变量
【发布时间】: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 变量。

标签: c# msbuild environment-variables msbuild-task


【解决方案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 结构化日志查看器中所示):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    相关资源
    最近更新 更多