我之前写过一些改变 MSBuild 编译过程的一些博客,包括利用 Microsoft.NET.Sdk 中各种自带的 Task 来执行各种各样的编译任务。更复杂的任务难以直接利用自带的 Task 实现,需要自己写 Task。

本文将编写一个内联的编译任务,获取当前编译环境下的所有编译目标(Target)。获取所有的这些 Target 对我们调试一些与 MSBuild 或编译相关的问题时可能带来一些帮助。


编写纯 C# 版本编译任务获取所有编译目标(Target)的代码是这样的:

using Microsoft.Build.Evaluation;
using Microsoft.Build.Execution;
using Microsoft.Build.Utilities;
using Microsoft.Build.Framework;

public class WalterlvGetAllTargets : Task
{
    public string ProjectFile { get; set; }

    public ITaskItem[] WalterlvTargets { get; set; }

    public override bool Execute()
    {
        var project = new Project(ProjectFile);

        var taskItems = new List<ITaskItem>(project.Targets.Count);
        foreach (KeyValuePair<string, ProjectTargetInstance> pair in project.Targets)
        {
            var target = pair.Value;
            var metadata = new Dictionary<string, string>
            {
                { "Condition", target.Condition },
                { "Inputs", target.Inputs },
                { "Outputs", target.Outputs },
                { "DependsOnTargets", target.DependsOnTargets }
            };
            taskItems.Add(new TaskItem(pair.Key, metadata));
        }

        WalterlvTargets = taskItems.ToArray();

        return true;
    }
}

那么转换成内联版本下面这样。为了方便验证,我直接把完整的 csproj 文件贴出来了。如果你希望在你的项目中去使用,可以只复制 UsingTaskTarget 两个部分。

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net472</TargetFramework>
    </PropertyGroup>

    <UsingTask TaskName="WalterlvGetAllTargets" TaskFactory="CodeTaskFactory"
               AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
        <ParameterGroup>
            <!-- 内联 C# 代码的输入参数(Task 的输入属性),相当于 public string ProjectFile { get; set; } -->
            <ProjectFile ParameterType="System.String" Required="true"/>
            <!-- 内联 C# 代码的输出参数(Task 的输入属性),相当于 public ITaskItem[] WalterlvTargets { get; set; } -->
            <WalterlvTargets ParameterType="Microsoft.Build.Framework.ITaskItem[]" Output="true"/>
        </ParameterGroup>
        <Task>
            <!-- 引用程序集。 -->
            <Reference Include="System.Xml"/>
            <Reference Include="Microsoft.Build"/>
            <Reference Include="Microsoft.Build.Framework"/>
            <!-- 编写 C# 代码所用到的 using。 -->
            <Using Namespace="Microsoft.Build.Evaluation"/>
            <Using Namespace="Microsoft.Build.Execution"/>
            <Using Namespace="Microsoft.Build.Utilities"/>
            <Using Namespace="Microsoft.Build.Framework"/>
            <!-- 开始插入 C# 代码。 -->
            <Code Type="Fragment" Language="cs">
        <![CDATA[
            var project = new Project(ProjectFile);

            var taskItems = new List<ITaskItem>(project.Targets.Count);
            foreach (KeyValuePair<string, ProjectTargetInstance> pair in project.Targets)
            {
                var target = pair.Value;
                var metadata = new Dictionary<string, string>
                {
                    { "Condition", target.Condition },
                    { "Inputs", target.Inputs },
                    { "Outputs", target.Outputs },
                    { "DependsOnTargets", target.DependsOnTargets }
                };
                taskItems.Add(new TaskItem(pair.Key, metadata));
            }

            WalterlvTargets = taskItems.ToArray();
        ]]>
            </Code>
        </Task>
    </UsingTask>

    <Target Name="WalterlvOutputAllTargets" AfterTargets="Build">
        <!-- 执行刚刚写的内联 Task,然后获取它的输出参数 WalterlvTargets 并填充到 TargetItems 集合中。 -->
        <WalterlvGetAllTargets ProjectFile="$(MSBuildProjectFile)">
            <Output ItemName="TargetItems" TaskParameter="WalterlvTargets"/>
        </WalterlvGetAllTargets>
        <!-- 用一个 Message 输出刚刚生成的 TargetItems 集合中每一项的 Identity 属性(集合中每一项都会输出。) -->
        <Message Text="输出的 Target:%(TargetItems.Identity)"/>
    </Target>
<Project>

现在使用 msbuild 命令进行编译,我们将看到所有 Target 的输出:

输出的所有 Target

WalterlvOutputAllTargets:
  输出的 TargetOutputAll
  输出的 Target_CheckForUnsupportedTargetFramework
  输出的 Target_CollectTargetFrameworkForTelemetry
  输出的 Target_CheckForUnsupportedNETCoreVersion
  输出的 Target_CheckForUnsupportedNETStandardVersion
  输出的 Target_CheckForUnsupportedAppHostUsage
  输出的 Target_CheckForMismatchingPlatform
  输出的 Target_CheckForNETCoreSdkIsPreview
  输出的 TargetAdjustDefaultPlatformTargetForNetFrameworkExeWithNoNativeCopyLocalItems
  输出的 TargetCreateManifestResourceNames
  输出的 TargetResolveCodeAnalysisRuleSet
  输出的 TargetXamlPreCompile
  输出的 TargetShimReferencePathsWhenCommonTargetsDoesNotUnderstandReferenceAssemblies
  输出的 Target_BeforeVBCSCoreCompile
  输出的 TargetInitializeSourceRootMappedPaths
  输出的 Target_InitializeSourceRootMappedPathsFromSourceControl
  输出的 Target_SetPathMapFromSourceRoots
  输出的 TargetCoreCompile
  输出的 TargetResolvePackageDependenciesDesignTime
  输出的 TargetCollectSDKReferencesDesignTime
  输出的 TargetCollectResolvedSDKReferencesDesignTime
  输出的 TargetCollectPackageReferences
  输出的 Target_CheckCompileDesignTimePrerequisite
  输出的 TargetCollectAnalyzersDesignTime
  输出的 TargetCollectResolvedCompilationReferencesDesignTime
  输出的 TargetCollectUpToDateCheckInputDesignTime
  输出的 TargetCollectUpToDateCheckOutputDesignTime
  输出的 TargetCollectUpToDateCheckBuiltDesignTime
  输出的 TargetCompileDesignTime
  输出的 Target_FixVCLibs120References
  输出的 Target_AddVCLibs140UniversalCrtDebugReference
  输出的 TargetInitializeSourceControlInformation
  输出的 Target_CheckForInvalidConfigurationAndPlatform
  输出的 TargetBuild
  输出的 TargetBeforeBuild
  输出的 TargetAfterBuild
  输出的 TargetCoreBuild
  输出的 TargetRebuild
  输出的 TargetBeforeRebuild
  输出的 TargetAfterRebuild
  输出的 TargetBuildGenerateSources
  输出的 TargetBuildGenerateSourcesTraverse
  输出的 TargetBuildCompile
  输出的 TargetBuildCompileTraverse
  输出的 TargetBuildLink
  输出的 TargetBuildLinkTraverse
  输出的 TargetCopyRunEnvironmentFiles
  输出的 TargetRun
  输出的 TargetBuildOnlySettings
  输出的 TargetPrepareForBuild
  输出的 TargetGetFrameworkPaths
  输出的 TargetGetReferenceAssemblyPaths
  输出的 TargetGetTargetFrameworkMoniker
  输出的 TargetGetTargetFrameworkMonikerDisplayName
  输出的 TargetGetTargetFrameworkDirectories
  输出的 TargetAssignLinkMetadata
  输出的 TargetPreBuildEvent
  输出的 TargetUnmanagedUnregistration
  输出的 TargetGetTargetFrameworkVersion
  输出的 TargetResolveReferences
  输出的 TargetBeforeResolveReferences
  输出的 TargetAfterResolveReferences
  输出的 TargetAssignProjectConfiguration
  输出的 Target_SplitProjectReferencesByFileExistence
  输出的 Target_GetProjectReferenceTargetFrameworkProperties
  输出的 TargetGetTargetFrameworks
  输出的 TargetGetTargetFrameworkProperties
  输出的 TargetPrepareProjectReferences
  输出的 TargetResolveProjectReferences
  输出的 TargetResolveProjectReferencesDesignTime
  输出的 TargetExpandSDKReferencesDesignTime
  输出的 TargetGetTargetPath
  输出的 TargetGetTargetPathWithTargetPlatformMoniker
  输出的 TargetGetNativeManifest
  输出的 TargetResolveNativeReferences
  输出的 TargetResolveAssemblyReferences
  输出的 TargetFindReferenceAssembliesForReferences
  输出的 TargetGenerateBindingRedirects
  输出的 TargetGenerateBindingRedirectsUpdateAppConfig
  输出的 TargetGetInstalledSDKLocations
  输出的 TargetResolveSDKReferences
  输出的 TargetResolveSDKReferencesDesignTime
  输出的 TargetFindInvalidProjectReferences
  输出的 TargetGetReferenceTargetPlatformMonikers
  输出的 TargetExpandSDKReferences
  输出的 TargetExportWindowsMDFile
  输出的 TargetResolveAssemblyReferencesDesignTime
  输出的 TargetDesignTimeResolveAssemblyReferences
  输出的 TargetResolveComReferences
  输出的 TargetResolveComReferencesDesignTime
  输出的 TargetPrepareResources
  输出的 TargetPrepareResourceNames
  输出的 TargetAssignTargetPaths
  输出的 TargetGetItemTargetPaths
  输出的 TargetSplitResourcesByCulture
  输出的 TargetCreateCustomManifestResourceNames
  输出的 TargetResGen
  输出的 TargetBeforeResGen
  输出的 TargetAfterResGen
  输出的 TargetCoreResGen
  输出的 TargetCompileLicxFiles
  输出的 TargetResolveKeySource
  输出的 TargetCompile
  输出的 Target_GenerateCompileInputs
  输出的 TargetGenerateTargetFrameworkMonikerAttribute
  输出的 TargetGenerateAdditionalSources
  输出的 TargetBeforeCompile
  输出的 TargetAfterCompile
  输出的 Target_TimeStampBeforeCompile
  输出的 Target_GenerateCompileDependencyCache
  输出的 Target_TimeStampAfterCompile
  输出的 Target_ComputeNonExistentFileProperty
  输出的 TargetGenerateSerializationAssemblies
  输出的 TargetCreateSatelliteAssemblies
  输出的 Target_GenerateSatelliteAssemblyInputs
  输出的 TargetGenerateSatelliteAssemblies
  输出的 TargetComputeIntermediateSatelliteAssemblies
  输出的 TargetSetWin32ManifestProperties
  输出的 Target_SetExternalWin32ManifestProperties
  输出的 Target_SetEmbeddedWin32ManifestProperties
  输出的 Target_GenerateResolvedDeploymentManifestEntryPoint
  输出的 TargetGenerateManifests
  输出的 TargetGenerateApplicationManifest
  输出的 Target_DeploymentComputeNativeManifestInfo
  输出的 Target_DeploymentComputeClickOnceManifestInfo
  输出的 Target_DeploymentGenerateTrustInfo
  输出的 TargetGenerateDeploymentManifest
  输出的 TargetPrepareForRun
  输出的 TargetCopyFilesToOutputDirectory
  输出的 Target_CopyFilesMarkedCopyLocal
  输出的 Target_CopySourceItemsToOutputDirectory
  输出的 TargetGetCopyToOutputDirectoryItems
  输出的 TargetGetCopyToPublishDirectoryItems
  输出的 Target_CopyOutOfDateSourceItemsToOutputDirectory
  输出的 Target_CopyOutOfDateSourceItemsToOutputDirectoryAlways
  输出的 Target_CopyAppConfigFile
  输出的 Target_CopyManifestFiles
  输出的 Target_CheckForCompileOutputs
  输出的 Target_SGenCheckForOutputs
  输出的 TargetUnmanagedRegistration
  输出的 TargetIncrementalClean
  输出的 Target_CleanGetCurrentAndPriorFileWrites
  输出的 TargetClean
  输出的 TargetBeforeClean
  输出的 TargetAfterClean
  输出的 TargetCleanReferencedProjects
  输出的 TargetCoreClean
  输出的 Target_CleanRecordFileWrites
  输出的 TargetCleanPublishFolder
  输出的 TargetPostBuildEvent
  输出的 TargetPublish
  输出的 Target_DeploymentUnpublishable
  输出的 TargetSetGenerateManifests
  输出的 TargetPublishOnly
  输出的 TargetBeforePublish
  输出的 TargetAfterPublish
  输出的 TargetPublishBuild
  输出的 Target_CopyFilesToPublishFolder
  输出的 Target_DeploymentGenerateBootstrapper
  输出的 Target_DeploymentSignClickOnceDeployment
  输出的 TargetAllProjectOutputGroups
  输出的 TargetBuiltProjectOutputGroup
  输出的 TargetDebugSymbolsProjectOutputGroup
  输出的 TargetDocumentationProjectOutputGroup
  输出的 TargetSatelliteDllsProjectOutputGroup
  输出的 TargetSourceFilesProjectOutputGroup
  输出的 TargetGetCompile
  输出的 TargetContentFilesProjectOutputGroup
  输出的 TargetSGenFilesOutputGroup
  输出的 TargetGetResolvedSDKReferences
  输出的 TargetCollectReferencedNuGetPackages
  输出的 TargetPriFilesOutputGroup
  输出的 TargetSDKRedistOutputGroup
  输出的 TargetAllProjectOutputGroupsDependencies
  输出的 TargetBuiltProjectOutputGroupDependencies
  输出的 TargetDebugSymbolsProjectOutputGroupDependencies
  输出的 TargetSatelliteDllsProjectOutputGroupDependencies
  输出的 TargetDocumentationProjectOutputGroupDependencies
  输出的 TargetSGenFilesOutputGroupDependencies
  输出的 TargetReferenceCopyLocalPathsOutputGroup
  输出的 TargetSetCABuildNativeEnvironmentVariables
  输出的 TargetRunCodeAnalysis
  输出的 TargetRunNativeCodeAnalysis
  输出的 TargetRunSelectedFileNativeCodeAnalysis
  输出的 TargetRunMergeNativeCodeAnalysis
  输出的 TargetImplicitlyExpandDesignTimeFacades
  输出的 TargetGetWinFXPath
  输出的 TargetDesignTimeMarkupCompilation
  输出的 TargetPrepareResourcesForSatelliteAssemblies
  输出的 Target_AfterCompileWinFXInternal
  输出的 TargetAfterCompileWinFX
  输出的 TargetAfterMarkupCompilePass1
  输出的 TargetAfterMarkupCompilePass2
  输出的 TargetMarkupCompilePass1
  输出的 TargetMarkupCompilePass2
  输出的 Target_CompileTemporaryAssembly
  输出的 TargetMarkupCompilePass2ForMainAssembly
  输出的 TargetGenerateTemporaryTargetAssembly
  输出的 TargetCleanupTemporaryTargetAssembly
  输出的 TargetAddIntermediateAssemblyToReferenceList
  输出的 TargetSatelliteOnlyMarkupCompilePass2
  输出的 TargetHostInBrowserValidation
  输出的 TargetSplashScreenValidation
  输出的 TargetResignApplicationManifest
  输出的 TargetSignDeploymentManifest
  输出的 TargetFileClassification
  输出的 TargetMainResourcesGeneration
  输出的 TargetSatelliteResourceGeneration
  输出的 TargetGenerateResourceWithCultureItem
  输出的 TargetCheckUid
  输出的 TargetUpdateUid
  输出的 TargetRemoveUid
  输出的 TargetMergeLocalizationDirectives
  输出的 TargetAssignWinFXEmbeddedResource
  输出的 TargetEntityDeploy
  输出的 TargetEntityDeploySplit
  输出的 TargetEntityDeployNonEmbeddedResources
  输出的 TargetEntityDeployEmbeddedResources
  输出的 TargetEntityClean
  输出的 TargetEntityDeploySetLogicalNames
  输出的 TargetDesignTimeXamlMarkupCompilation
  输出的 TargetInProcessXamlMarkupCompilePass1
  输出的 TargetCleanInProcessXamlGeneratedFiles
  输出的 TargetXamlMarkupCompileReadGeneratedFileList
  输出的 TargetXamlMarkupCompilePass1
  输出的 TargetXamlMarkupCompileAddFilesGenerated
  输出的 TargetXamlMarkupCompileReadPass2Flag
  输出的 TargetXamlTemporaryAssemblyGeneration
  输出的 TargetCompileTemporaryAssembly
  输出的 TargetXamlMarkupCompilePass2
  输出的 TargetXamlMarkupCompileAddExtensionFilesGenerated
  输出的 TargetGetCopyToOutputDirectoryXamlAppDefs
  输出的 TargetExpressionBuildExtension
  输出的 TargetValidationExtension
  输出的 TargetGenerateCompiledExpressionsTempFile
  输出的 TargetAddDeferredValidationErrorsFileToFileWrites
  输出的 TargetReportValidationBuildExtensionErrors
  输出的 TargetDeferredValidation
  输出的 TargetResolveTestReferences
  输出的 TargetCleanAppxPackage
  输出的 TargetGetPackagingOutputs
  输出的 TargetRestore
  输出的 TargetGenerateRestoreGraphFile
  输出的 Target_LoadRestoreGraphEntryPoints
  输出的 Target_FilterRestoreGraphProjectInputItems
  输出的 Target_GenerateRestoreGraph
  输出的 Target_GenerateRestoreGraphProjectEntry
  输出的 Target_GenerateRestoreSpecs
  输出的 Target_GenerateDotnetCliToolReferenceSpecs
  输出的 Target_GetProjectJsonPath
  输出的 Target_GetRestoreProjectStyle
  输出的 TargetEnableIntermediateOutputPathMismatchWarning
  输出的 Target_GetRestoreTargetFrameworksOutput
  输出的 Target_GetRestoreTargetFrameworksAsItems
  输出的 Target_GetRestoreSettings
  输出的 Target_GetRestoreSettingsCurrentProject
  输出的 Target_GetRestoreSettingsAllFrameworks
  输出的 Target_GetRestoreSettingsPerFramework
  输出的 Target_GenerateRestoreProjectSpec
  输出的 Target_GenerateProjectRestoreGraph
  输出的 Target_GenerateRestoreDependencies
  输出的 Target_GenerateProjectRestoreGraphAllFrameworks
  输出的 Target_GenerateProjectRestoreGraphCurrentProject
  输出的 Target_GenerateProjectRestoreGraphPerFramework
  输出的 Target_GenerateRestoreProjectPathItemsCurrentProject
  输出的 Target_GenerateRestoreProjectPathItemsPerFramework
  输出的 Target_GenerateRestoreProjectPathItems
  输出的 Target_GenerateRestoreProjectPathItemsAllFrameworks
  输出的 Target_GenerateRestoreProjectPathWalk
  输出的 Target_GetAllRestoreProjectPathItems
  输出的 Target_GetRestoreSettingsOverrides
  输出的 Target_GetRestorePackagesPathOverride
  输出的 Target_GetRestoreSourcesOverride
  输出的 Target_GetRestoreFallbackFoldersOverride
  输出的 Target_IsProjectRestoreSupported
  输出的 TargetDesktopBridgeCopyLocalOutputGroup
  输出的 TargetDesktopBridgeComFilesOutputGroup
  输出的 TargetGetDeployableContentReferenceOutputs
  输出的 TargetDockerResolveAppType
  输出的 TargetDockerUpdateComposeVsGeneratedFiles
  输出的 TargetDockerResolveTargetFramework
  输出的 TargetDockerComposeBuild
  输出的 TargetDockerPackageService
  输出的 TargetImplicitlyExpandNETStandardFacades
  输出的 Target_RemoveZipFileSuggestedRedirect
  输出的 TargetSetARM64AppxPackageInputsForInboxNetNative
  输出的 Target_CleanMdbFiles
  输出的 TargetPreXsdCodeGen
  输出的 TargetXsdCodeGen
  输出的 TargetXsdResolveReferencePath
  输出的 TargetCleanXsdCodeGen
  输出的 Target_SetTargetFrameworkMonikerAttribute
  输出的 TargetResolvePackageDependenciesForBuild
  输出的 TargetRunResolvePackageDependencies
  输出的 TargetResolvePackageAssets
  输出的 TargetFilterSatelliteResources
  输出的 TargetRunProduceContentAssets
  输出的 TargetReportAssetsLogMessages
  输出的 TargetResolveLockFileReferences
  输出的 TargetIncludeTransitiveProjectReferences
  输出的 TargetResolveLockFileAnalyzers
  输出的 Target_ComputeLockFileCopyLocal
  输出的 TargetResolveLockFileCopyLocalProjectDeps
  输出的 TargetCheckForImplicitPackageReferenceOverrides
  输出的 TargetCheckForDuplicateItems
  输出的 TargetGenerateBuildDependencyFile
  输出的 TargetGenerateBuildRuntimeConfigurationFiles
  输出的 TargetAddRuntimeConfigFileToBuiltProjectOutputGroupOutput
  输出的 Target_SdkBeforeClean
  输出的 Target_SdkBeforeRebuild
  输出的 Target_ComputeNETCoreBuildOutputFiles
  输出的 Target_ComputeReferenceAssemblies
  输出的 TargetCoreGenerateSatelliteAssemblies
  输出的 Target_GetAssemblyInfoFromTemplateFile
  输出的 Target_DefaultMicrosoftNETPlatformLibrary
  输出的 TargetGetAllRuntimeIdentifiers
  输出的 TargetGenerateAssemblyInfo
  输出的 TargetAddSourceRevisionToInformationalVersion
  输出的 TargetGetAssemblyAttributes
  输出的 TargetCreateGeneratedAssemblyInfoInputsCacheFile
  输出的 TargetCoreGenerateAssemblyInfo
  输出的 TargetGetAssemblyVersion
  输出的 TargetComposeStore
  输出的 TargetStoreWorkerMain
  输出的 TargetStoreWorkerMapper
  输出的 TargetStoreResolver
  输出的 TargetStoreWorkerPerformWork
  输出的 TargetStoreFinalizer
  输出的 Target_CopyResolvedOptimizedFiles
  输出的 TargetPrepareForComposeStore
  输出的 TargetPrepforRestoreForComposeStore
  输出的 TargetRestoreForComposeStore
  输出的 TargetComputeAndCopyFilesToStoreDirectory
  输出的 TargetCopyFilesToStoreDirectory
  输出的 Target_CopyResolvedUnOptimizedFiles
  输出的 Target_ComputeResolvedFilesToStoreTypes
  输出的 Target_SplitResolvedFiles
  输出的 Target_GetResolvedFilesToStore
  输出的 TargetComputeFilesToStore
  输出的 TargetPrepRestoreForStoreProjects
  输出的 TargetPrepOptimizer
  输出的 Target_RunOptimizer
  输出的 TargetRunCrossGen
  输出的 Target_InitializeBasicProps
  输出的 Target_GetCrossgenProps
  输出的 Target_SetupStageForCrossgen
  输出的 Target_RestoreCrossgen
  输出的 Target_CheckForObsoleteDotNetCliToolReferences
  输出的 Target_PublishBuildAlternative
  输出的 Target_PublishNoBuildAlternative
  输出的 Target_PreventProjectReferencesFromBuilding
  输出的 TargetPrepareForPublish
  输出的 TargetComputeAndCopyFilesToPublishDirectory
  输出的 TargetCopyFilesToPublishDirectory
  输出的 Target_CopyResolvedFilesToPublishPreserveNewest
  输出的 Target_CopyResolvedFilesToPublishAlways
  输出的 Target_ComputeResolvedFilesToPublishTypes
  输出的 TargetComputeFilesToPublish
  输出的 Target_ComputeNetPublishAssets
  输出的 TargetRunResolvePublishAssemblies
  输出的 TargetFilterPublishSatelliteResources
  输出的 Target_ComputeCopyToPublishDirectoryItems
  输出的 TargetDefaultCopyToPublishDirectoryMetadata
  输出的 TargetGeneratePublishDependencyFile
  输出的 Target_ComputeExcludeFromPublishPackageReferences
  输出的 Target_ParseTargetManifestFiles
  输出的 TargetGeneratePublishRuntimeConfigurationFile
  输出的 TargetDeployAppHost
  输出的 TargetPackTool
  输出的 TargetGenerateToolsSettingsFileFromBuildProperty
  输出的 TargetResolveApphostAsset
  输出的 TargetComputeDependencyFileCompilerOptions
  输出的 TargetComputeRefAssembliesToPublish
  输出的 Target_CopyReferenceOnlyAssembliesForBuild
  输出的 Target_HandlePackageFileConflicts
  输出的 Target_HandlePublishFileConflicts
  输出的 Target_GetOutputItemsFromPack
  输出的 Target_GetTargetFrameworksOutput
  输出的 Target_PackAsBuildAfterTarget
  输出的 Target_CleanPackageFiles
  输出的 Target_CalculateInputsOutputsForPack
  输出的 TargetPack
  输出的 Target_IntermediatePack
  输出的 TargetGenerateNuspec
  输出的 Target_InitializeNuspecRepositoryInformationProperties
  输出的 Target_LoadPackInputItems
  输出的 Target_GetProjectReferenceVersions
  输出的 Target_GetProjectVersion
  输出的 Target_WalkEachTargetPerFramework
  输出的 Target_GetFrameworksWithSuppressedDependencies
  输出的 Target_GetFrameworkAssemblyReferences
  输出的 Target_GetBuildOutputFilesWithTfm
  输出的 Target_GetTfmSpecificContentForPackage
  输出的 Target_GetDebugSymbolsWithTfm
  输出的 Target_AddPriFileToPackBuildOutput
  输出的 Target_GetPackageFiles

参考资料


本文会经常更新,请阅读原文: https://dotnet-campus.github.io//post/write-a-msbuild-inline-task-for-getting-all-targets.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 dotnet 职业技术学院 (包含链接: https://dotnet-campus.github.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系