Loading...
Loading...
Compare original and translation side by side
Microsoft.Common.CurrentVersion.targetsMicrosoft.Common.CurrentVersion.targets<PropertyGroup>
<BuildDependsOn>
BeforeBuild;
CoreBuild;
AfterBuild
</BuildDependsOn>
</PropertyGroup>
<Target Name="Build"
Condition=" '$(_InvalidConfigurationWarning)' != 'true' "
DependsOnTargets="$(BuildDependsOn)"
Returns="@(TargetPathWithTargetPlatformMoniker)" />
<!-- Empty extensibility targets — users override these -->
<Target Name="BeforeBuild" />
<Target Name="AfterBuild" />CoreBuild$(CoreBuildDependsOn)<Target Name="CoreBuild" DependsOnTargets="$(CoreBuildDependsOn)">
<OnError ExecuteTargets="_TimeStampAfterCompile;PostBuildEvent"
Condition="'$(RunPostBuildEvent)' == 'Always'" />
<OnError ExecuteTargets="_CleanRecordFileWrites" />
</Target><PropertyGroup>
<BuildDependsOn>
BeforeBuild;
CoreBuild;
AfterBuild
</BuildDependsOn>
</PropertyGroup>
<Target Name="Build"
Condition=" '$(_InvalidConfigurationWarning)' != 'true' "
DependsOnTargets="$(BuildDependsOn)"
Returns="@(TargetPathWithTargetPlatformMoniker)" />
<!-- 空的可扩展Target —— 用户可重写这些Target -->
<Target Name="BeforeBuild" />
<Target Name="AfterBuild" />CoreBuild$(CoreBuildDependsOn)<Target Name="CoreBuild" DependsOnTargets="$(CoreBuildDependsOn)">
<OnError ExecuteTargets="_TimeStampAfterCompile;PostBuildEvent"
Condition="'$(RunPostBuildEvent)' == 'Always'" />
<OnError ExecuteTargets="_CleanRecordFileWrites" />
</Target>DependsOnTargets="$(MyTargetDependsOn)"OnErrorDependsOnTargets="$(MyTargetDependsOn)"OnErrorDependsOn<!-- GOOD: Append to existing chain -->
<PropertyGroup>
<CompileDependsOn>$(CompileDependsOn);MyCodeGenTarget</CompileDependsOn>
</PropertyGroup>
<!-- BAD: Overwrites the entire chain, dropping SDK targets -->
<PropertyGroup>
<CompileDependsOn>MyCodeGenTarget</CompileDependsOn>
</PropertyGroup>DependsOn<!-- 正确:追加到现有链 -->
<PropertyGroup>
<CompileDependsOn>$(CompileDependsOn);MyCodeGenTarget</CompileDependsOn>
</PropertyGroup>
<!-- 错误:覆盖整个链,丢弃SDK Target -->
<PropertyGroup>
<CompileDependsOn>MyCodeGenTarget</CompileDependsOn>
</PropertyGroup>| Mechanism | Defined in | Best for |
|---|---|---|
| The target that needs deps | Target explicitly requires others |
| The injecting target | Insert before a target you don't own |
| The injecting target | Insert after a target you don't own |
BeforeTargets<Target Name="_CheckForInvalidConfigurationAndPlatform"
BeforeTargets="$(BuildDependsOn);Build;$(RebuildDependsOn);Rebuild;$(CleanDependsOn);Clean">
</Target>DependsOnTargetsBeforeTargetsAfterTargetsBeforeTargets="CoreCompile"$(CompileDependsOn)| 机制 | 定义位置 | 最佳适用场景 |
|---|---|---|
| 需要依赖项的Target | Target明确需要其他Target作为前置条件 |
| 注入的Target | 在不属于你的Target之前插入 |
| 注入的Target | 在不属于你的Target之后插入 |
BeforeTargets<Target Name="_CheckForInvalidConfigurationAndPlatform"
BeforeTargets="$(BuildDependsOn);Build;$(RebuildDependsOn);Rebuild;$(CleanDependsOn);Clean">
</Target>DependsOnTargetsBeforeTargetsAfterTargetsBeforeTargets="CoreCompile"$(CompileDependsOn)<!-- Build returns items for consumption by referencing projects -->
<Target Name="Build"
DependsOnTargets="$(BuildDependsOn)"
Returns="@(TargetPathWithTargetPlatformMoniker)" />
<!-- GetTargetPath is a lightweight query target -->
<Target Name="GetTargetPath" Returns="@(TargetPathWithTargetPlatformMoniker)" />ReturnsOutputsGetTargetPathGetTargetFrameworksReturnsOutputs<!-- Build返回供引用项目使用的项 -->
<Target Name="Build"
DependsOnTargets="$(BuildDependsOn)"
Returns="@(TargetPathWithTargetPlatformMoniker)" />
<!-- GetTargetPath是轻量级查询Target -->
<Target Name="GetTargetPath" Returns="@(TargetPathWithTargetPlatformMoniker)" />ReturnsOutputsGetTargetPathGetTargetFrameworksReturnsOutputs| Pattern | Meaning | Example |
|---|---|---|
| Internal/private target | |
| The actual implementation | |
| Empty extensibility hooks | |
| Setup/validation phase | |
| Discovery/resolution phase | |
| Lightweight query (no side effects) | |
| 模式 | 含义 | 示例 |
|---|---|---|
| 内部/私有Target | |
| 实际实现逻辑 | |
| 空的可扩展钩子 | |
| 设置/验证阶段 | |
| 发现/解析阶段 | |
| 轻量级查询(无副作用) | |
<!-- 1. Define the DependsOn chain for extensibility -->
<PropertyGroup>
<MyFeatureDependsOn>
_ValidateMyFeatureInputs;
BeforeMyFeature;
CoreMyFeature;
AfterMyFeature
</MyFeatureDependsOn>
</PropertyGroup>
<!-- 2. Outer target with Returns for inter-project communication -->
<Target Name="MyFeature"
DependsOnTargets="$(MyFeatureDependsOn)"
Returns="@(MyFeatureOutput)" />
<!-- 3. Empty extensibility points -->
<Target Name="BeforeMyFeature" />
<Target Name="AfterMyFeature" />
<!-- 4. Core implementation with Inputs/Outputs for incrementality -->
<Target Name="CoreMyFeature"
Inputs="$(MSBuildAllProjects);@(MyFeatureInput)"
Outputs="$(IntermediateOutputPath)myfeature.generated.cs">
<Exec Command="my-tool.exe -o $(IntermediateOutputPath)myfeature.generated.cs" />
<!-- 5. Register outputs for clean tracking -->
<ItemGroup>
<Compile Include="$(IntermediateOutputPath)myfeature.generated.cs" />
<FileWrites Include="$(IntermediateOutputPath)myfeature.generated.cs" />
</ItemGroup>
</Target>
<!-- 6. Validation target runs first in the dependency chain -->
<Target Name="_ValidateMyFeatureInputs">
<Error Text="MyFeatureInput items are required."
Condition="'@(MyFeatureInput)' == ''" />
</Target><!-- 1. 定义用于扩展的DependsOn链 -->
<PropertyGroup>
<MyFeatureDependsOn>
_ValidateMyFeatureInputs;
BeforeMyFeature;
CoreMyFeature;
AfterMyFeature
</MyFeatureDependsOn>
</PropertyGroup>
<!-- 2. 带有Returns的外部Target,用于项目间通信 -->
<Target Name="MyFeature"
DependsOnTargets="$(MyFeatureDependsOn)"
Returns="@(MyFeatureOutput)" />
<!-- 3. 空的扩展点 -->
<Target Name="BeforeMyFeature" />
<Target Name="AfterMyFeature" />
<!-- 4. 带有Inputs/Outputs的核心实现,用于增量构建 -->
<Target Name="CoreMyFeature"
Inputs="$(MSBuildAllProjects);@(MyFeatureInput)"
Outputs="$(IntermediateOutputPath)myfeature.generated.cs">
<Exec Command="my-tool.exe -o $(IntermediateOutputPath)myfeature.generated.cs" />
<!-- 5. 注册输出以进行清理跟踪 -->
<ItemGroup>
<Compile Include="$(IntermediateOutputPath)myfeature.generated.cs" />
<FileWrites Include="$(IntermediateOutputPath)myfeature.generated.cs" />
</ItemGroup>
</Target>
<!-- 6. 验证Target在依赖链中最先执行 -->
<Target Name="_ValidateMyFeatureInputs">
<Error Text="MyFeatureInput项是必需的。"
Condition="'@(MyFeatureInput)' == ''" />
</Target>DependsOn$(ExistingProperty)OutputsReturns.propsBeforeTargets.targetsOnErrorDependsOn$(ExistingProperty)OutputsReturns.propsBeforeTargets.targetsOnError