了解msbuild:打印变量值

时间:2017-08-09 12:58:05

标签: build msbuild csproj

我在csproj中关注Import。 如何在道具的这一点找到Variable的价值?

<Import Project="<path_to_abc>\$(Variable)\abc.props>"
        Condition=" '$(Variable)' != '' "       
/>

我遇到了构建错误:

can not find props files : `<path_to_abc>\\abc.props` 

我怎样才能在这里看到Variable的价值? 如果我将Message放在Import之上的csproj中,我应该给出什么Target依赖?

<Target Name="PrintInfo" BeforeTargets="BeforeBuild">
   <Message Text="'$(Variable)' $(Variable.length) " />
</Target>

给了我'' 0

但那是因为BeforeBuild

msbuild是如何工作的? 它是否在第一个订单之前和之前处理所有属性? 然后,如果它处理Targets,它是否在当前时间打印该值?

如何在评估道具时看到放入的值?

1 个答案:

答案 0 :(得分:2)

可悲的是,目前还没有记录导入,随着即将推出的MSBuild 15.3版本及其二进制日志记录功能,这种情况即将发生变化。

使用/flp:Verbosity=diagnostic调用msbuild会将属性重新分配事件发送到msbuild.log文件,如下所示:

0>Property reassignment: $(Foo)="bar" (previous value: "foo") at /Users/martin.ullrich/tmp/test.proj (10,5)

然后,日志将包含一个Initial Properties列表,其中包含项目的完全评估属性(包括导入)。

必须理解语句属性定义和导入语句按顺序处理所以当<Import>使用属性时 - 无论是条件还是项目路径 - 它都将在那一刻使用该属性的值。

还有一些其他重要方面:

  • 在项目组和项目定义组之前处理属性组。甚至在所有进口项目中! (所以带条件的<ItemGroup>会看到之后定义/导入的属性值)
  • 目标条件在考虑执行目标时进行评估,并且可能受所有导入的项目文件和已经运行的其他目标中发生的修改的影响。