【问题标题】:Outputting environment variables from MSBuild .targets files从 MSBuild .targets 文件输出环境变量
【发布时间】:2016-07-11 13:10:38
【问题描述】:

假设我有一个 .targets 文件,它被称为一长串构建相关脚本的一部分,并使用了一些环境变量。您能否建议一种调试构建过程并在构建过程到达文件后检查变量值的好方法?

【问题讨论】:

  • 如果不知道您使用的是哪个构建系统,就无法回答这个问题。甚至可能这个问题根本没有意义; “一旦文件通过构建过程到达”似乎定义不明确。
  • MSBuild 是否足够具体?
  • 是的,但我不知道 MSBuild 是否会处理一次 .targets 文件。我会把答案留给其他人。

标签: msbuild environment-variables targets


【解决方案1】:

MSBuild 在构建过程的一开始就“读取”环境变量,即在您调用 MSBuild.exe 时。然后它们可以作为与环境变量同名的属性访问(例如$(PATH))。

因此,如果您只需要知道环境变量的值,通常在启动时列出变量就足够了。通常使用 /v:diag 启动 MSBuild。输出将类似于:

Microsoft (R) Build Engine 版本 14.0.25420.1 版权所有 (C) 微软公司。保留所有权利。

C:\Program Files (x86)\MSBuild\14.0\bin\MSBuild.exe /v:diag .\clrinfo32.csproj
Build started 12.07.2016 14:51:35.
Environment at start of build:
ActiveLanguage = en-US
ALLUSERSPROFILE = C:\ProgramData
APPDATA = C:\Users\foobar\AppData\Roaming
...

但是请注意,环境变量的值将在整个构建过程中保持不变 (*),有趣的问题是 MSBuild 属性的值(已使用环境变量的值初始化在构建开始时)是在构建过程中的某个时间点。

可以覆盖属性值(通过在命令行上指定,通过在<PropertyGroup>-elements 中显式设置等)。 order of evaluation 也很重要。

如果您只需要在任务执行期间知道某个属性的值,通常使用<Message Importance="high" Text="$(myproperty)"/> 就足够了。除此之外,请注意,MSBuild 执行也可以是debugged

(*) 假设没有自定义任务在后台使用Environment.SetEnvironmentVariable() 之类的东西进行设置。但这又不会更改在 MSBuild 开始时从变量初始化的属性的值。

【讨论】:

  • 我发现您必须在后面加上项目名称。输出是解析指定项目的结果。甜!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 2015-07-24
  • 2021-06-18
  • 1970-01-01
相关资源
最近更新 更多