msbuild-属性/项的作用域/继承规则是什么?

msbuild-属性/项的作用域/继承规则是什么?,msbuild,Msbuild,我的工作msbuild项目中有以下定义 <MSBuild Projects="$(MSBuildProjectFile)" Condition="'@(FilesToCompile)' != ''" Targets="buildcpp" Properties="CPPFILE=%(FilesToCompile.FullPath);OBJFILE=$(ObjectFolder)\%(FilesToCompile.Filename

我的工作msbuild项目中有以下定义

<MSBuild
        Projects="$(MSBuildProjectFile)"
        Condition="'@(FilesToCompile)' != ''"
        Targets="buildcpp"
        Properties="CPPFILE=%(FilesToCompile.FullPath);OBJFILE=$(ObjectFolder)\%(FilesToCompile.Filename).doj;IncludeDirs=$(IncludeDirs)"
    />
…它使用属性
$(OBJFILE)
,即使调用者从未传入该属性

<Target Name="compilecpp" Inputs="$(INPUTFILES)" Outputs="$(OBJFILE)">
    <Message Importance="high" Text="$(CPPFILE): Compiling..."/>
...

...
问题

由于此msbuild有效,我可以推断
$(OBJFILE)
是可访问的;为什么它是可访问的?属性的作用域规则是什么?

使用
任务时,将执行新的msbuild运行,类似于使用参数运行
msbuild.exe
。特别是,传入属性类似于传入
/p:PropName=Value
参数-它为这次运行定义了新的“全局属性”

在此内部生成期间,该属性仍然存在,并且可以由其他内部生成(buildcpp->compilecpp)访问,除非被覆盖。因此,
OBJFILE
只能在
compilecpp
中访问,因为它被定义为父msbuild运行的全局属性。如果以某种方式直接调用了
compilecpp
,则不会定义该属性(假定该属性未在其他地方设置)。如果要停止转发全局属性,则需要使用MSBuild任务的
RemoveProperties
参数。因此,如果您设置了
RemoveProperties=“OBJFILE”
,那么它就不会被激活

仅供参考,在.NET核心项目中,
RemoveProperties
用于不将
RuntimeIdentifier
从自包含的应用转发到引用的项目,这些项目可能无法使用此属性集进行构建(由于缺少还原信息)

有关更多信息,请阅读-特别是有关全局属性的部分-和(重要部分是
属性的说明
参数)。但是,传递全局属性的事实并没有明确记录(尽管
RemoveProperties
暗示了这一点)

更新:已更新以描述此行为:

全局属性也转发给子项目,除非 MSBuild任务的RemoveProperties属性用于指定 不转发的项目列表


MSBuild/ClallTarget任务继承所有全局属性。不确定这在官方文档中的确切位置,但它在这里,例如:@stijn by
全局属性
您是指在调用
MSBuild/CallTarget
时存在的所有属性吗?是的。实际上,如果在“详细性”设置为“诊断”的情况下运行msbuild(命令行或任务),它将输出它知道的所有属性。可以非常方便。你知道官方文档中在哪里说明了这一点吗?是的,我知道,但是他们没有说通过MSBuild任务(你称之为“内部构建”)运行的项目继承了父属性,对吗?没错,没有说它们是转发的。
RemoveProperties
的文档说明了这一点。非常有用:(-但是,这就是它的实现方式,以及将任何自定义属性传递到解决方案构建的方式。打开了全局属性的PR文档:好的,太好了!
<Target Name="compilecpp" Inputs="$(INPUTFILES)" Outputs="$(OBJFILE)">
    <Message Importance="high" Text="$(CPPFILE): Compiling..."/>
...