如何调用MSBuild项目目标而不递归触发子项目同名目标
解决MSBuild仅调用指定项目目标而不触发子项目同名目标的问题
方法一:调用目标时启用跳过不存在的目标
在Directory.Solution.targets的BuildAll目标中,调用TopLevelProject:CollectNZip时添加SkipNonexistentTargets=true属性,让MSBuild忽略子项目中不存在的同名目标,仅输出警告而非报错:
<Target Name="BuildAll"> <MSBuild Projects="TopLevelProject.csproj" Targets="CollectNZip" Properties="SkipNonexistentTargets=true" /> </Target>
方法二:禁止构建项目依赖项,直接执行目标
如果子项目已经提前构建完成,或者你希望单独执行TopLevelProject的CollectNZip而不触发依赖项目的构建(及同名目标调用),可以添加BuildProjectReferences=false属性,彻底跳过依赖项目的处理:
<Target Name="BuildAll"> <!-- 可选:先单独构建所有子项目 --> <MSBuild Projects="SubProjectA.csproj;SubProjectB.csproj;SubProjectC.csproj" Targets="Build" /> <!-- 执行TopLevelProject的CollectNZip,不处理依赖项 --> <MSBuild Projects="TopLevelProject.csproj" Targets="CollectNZip" Properties="BuildProjectReferences=false" /> </Target>
方法三:修改TopLevelProject的目标定义,限制执行范围
在TopLevelProject的项目文件中,给CollectNZip目标添加条件,仅当当前执行的项目是TopLevelProject时才执行逻辑。同时如果该目标依赖Build,避免使用BeforeTargets/AfterTargets触发子项目的同名目标,改用DependsOnTargets:
<Target Name="CollectNZip" DependsOnTargets="Build"> <!-- 仅当前项目为TopLevelProject时执行逻辑 --> <Message Text="执行CollectNZip处理逻辑" Condition="'$(MSBuildProjectName)' == 'TopLevelProject'" /> <!-- 你的CollectNZip具体实现代码 --> </Target>
内容的提问来源于stack exchange,提问作者videoguy
相关产品推荐
相关产品推荐

