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