当前位置: 首页 > news >正文

编写 MSBuild 内联编译任务(Task)用于获取当前编译环境下的所有编译目标(Target)

我之前写过一些改变 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:
  输出的 Target:OutputAll
  输出的 Target:_CheckForUnsupportedTargetFramework
  输出的 Target:_CollectTargetFrameworkForTelemetry
  输出的 Target:_CheckForUnsupportedNETCoreVersion
  输出的 Target:_CheckForUnsupportedNETStandardVersion
  输出的 Target:_CheckForUnsupportedAppHostUsage
  输出的 Target:_CheckForMismatchingPlatform
  输出的 Target:_CheckForNETCoreSdkIsPreview
  输出的 Target:AdjustDefaultPlatformTargetForNetFrameworkExeWithNoNativeCopyLocalItems
  输出的 Target:CreateManifestResourceNames
  输出的 Target:ResolveCodeAnalysisRuleSet
  输出的 Target:XamlPreCompile
  输出的 Target:ShimReferencePathsWhenCommonTargetsDoesNotUnderstandReferenceAssemblies
  输出的 Target:_BeforeVBCSCoreCompile
  输出的 Target:InitializeSourceRootMappedPaths
  输出的 Target:_InitializeSourceRootMappedPathsFromSourceControl
  输出的 Target:_SetPathMapFromSourceRoots
  输出的 Target:CoreCompile
  输出的 Target:ResolvePackageDependenciesDesignTime
  输出的 Target:CollectSDKReferencesDesignTime
  输出的 Target:CollectResolvedSDKReferencesDesignTime
  输出的 Target:CollectPackageReferences
  输出的 Target:_CheckCompileDesignTimePrerequisite
  输出的 Target:CollectAnalyzersDesignTime
  输出的 Target:CollectResolvedCompilationReferencesDesignTime
  输出的 Target:CollectUpToDateCheckInputDesignTime
  输出的 Target:CollectUpToDateCheckOutputDesignTime
  输出的 Target:CollectUpToDateCheckBuiltDesignTime
  输出的 Target:CompileDesignTime
  输出的 Target:_FixVCLibs120References
  输出的 Target:_AddVCLibs140UniversalCrtDebugReference
  输出的 Target:InitializeSourceControlInformation
  输出的 Target:_CheckForInvalidConfigurationAndPlatform
  输出的 Target:Build
  输出的 Target:BeforeBuild
  输出的 Target:AfterBuild
  输出的 Target:CoreBuild
  输出的 Target:Rebuild
  输出的 Target:BeforeRebuild
  输出的 Target:AfterRebuild
  输出的 Target:BuildGenerateSources
  输出的 Target:BuildGenerateSourcesTraverse
  输出的 Target:BuildCompile
  输出的 Target:BuildCompileTraverse
  输出的 Target:BuildLink
  输出的 Target:BuildLinkTraverse
  输出的 Target:CopyRunEnvironmentFiles
  输出的 Target:Run
  输出的 Target:BuildOnlySettings
  输出的 Target:PrepareForBuild
  输出的 Target:GetFrameworkPaths
  输出的 Target:GetReferenceAssemblyPaths
  输出的 Target:GetTargetFrameworkMoniker
  输出的 Target:GetTargetFrameworkMonikerDisplayName
  输出的 Target:GetTargetFrameworkDirectories
  输出的 Target:AssignLinkMetadata
  输出的 Target:PreBuildEvent
  输出的 Target:UnmanagedUnregistration
  输出的 Target:GetTargetFrameworkVersion
  输出的 Target:ResolveReferences
  输出的 Target:BeforeResolveReferences
  输出的 Target:AfterResolveReferences
  输出的 Target:AssignProjectConfiguration
  输出的 Target:_SplitProjectReferencesByFileExistence
  输出的 Target:_GetProjectReferenceTargetFrameworkProperties
  输出的 Target:GetTargetFrameworks
  输出的 Target:GetTargetFrameworkProperties
  输出的 Target:PrepareProjectReferences
  输出的 Target:ResolveProjectReferences
  输出的 Target:ResolveProjectReferencesDesignTime
  输出的 Target:ExpandSDKReferencesDesignTime
  输出的 Target:GetTargetPath
  输出的 Target:GetTargetPathWithTargetPlatformMoniker
  输出的 Target:GetNativeManifest
  输出的 Target:ResolveNativeReferences
  输出的 Target:ResolveAssemblyReferences
  输出的 Target:FindReferenceAssembliesForReferences
  输出的 Target:GenerateBindingRedirects
  输出的 Target:GenerateBindingRedirectsUpdateAppConfig
  输出的 Target:GetInstalledSDKLocations
  输出的 Target:ResolveSDKReferences
  输出的 Target:ResolveSDKReferencesDesignTime
  输出的 Target:FindInvalidProjectReferences
  输出的 Target:GetReferenceTargetPlatformMonikers
  输出的 Target:ExpandSDKReferences
  输出的 Target:ExportWindowsMDFile
  输出的 Target:ResolveAssemblyReferencesDesignTime
  输出的 Target:DesignTimeResolveAssemblyReferences
  输出的 Target:ResolveComReferences
  输出的 Target:ResolveComReferencesDesignTime
  输出的 Target:PrepareResources
  输出的 Target:PrepareResourceNames
  输出的 Target:AssignTargetPaths
  输出的 Target:GetItemTargetPaths
  输出的 Target:SplitResourcesByCulture
  输出的 Target:CreateCustomManifestResourceNames
  输出的 Target:ResGen
  输出的 Target:BeforeResGen
  输出的 Target:AfterResGen
  输出的 Target:CoreResGen
  输出的 Target:CompileLicxFiles
  输出的 Target:ResolveKeySource
  输出的 Target:Compile
  输出的 Target:_GenerateCompileInputs
  输出的 Target:GenerateTargetFrameworkMonikerAttribute
  输出的 Target:GenerateAdditionalSources
  输出的 Target:BeforeCompile
  输出的 Target:AfterCompile
  输出的 Target:_TimeStampBeforeCompile
  输出的 Target:_GenerateCompileDependencyCache
  输出的 Target:_TimeStampAfterCompile
  输出的 Target:_ComputeNonExistentFileProperty
  输出的 Target:GenerateSerializationAssemblies
  输出的 Target:CreateSatelliteAssemblies
  输出的 Target:_GenerateSatelliteAssemblyInputs
  输出的 Target:GenerateSatelliteAssemblies
  输出的 Target:ComputeIntermediateSatelliteAssemblies
  输出的 Target:SetWin32ManifestProperties
  输出的 Target:_SetExternalWin32ManifestProperties
  输出的 Target:_SetEmbeddedWin32ManifestProperties
  输出的 Target:_GenerateResolvedDeploymentManifestEntryPoint
  输出的 Target:GenerateManifests
  输出的 Target:GenerateApplicationManifest
  输出的 Target:_DeploymentComputeNativeManifestInfo
  输出的 Target:_DeploymentComputeClickOnceManifestInfo
  输出的 Target:_DeploymentGenerateTrustInfo
  输出的 Target:GenerateDeploymentManifest
  输出的 Target:PrepareForRun
  输出的 Target:CopyFilesToOutputDirectory
  输出的 Target:_CopyFilesMarkedCopyLocal
  输出的 Target:_CopySourceItemsToOutputDirectory
  输出的 Target:GetCopyToOutputDirectoryItems
  输出的 Target:GetCopyToPublishDirectoryItems
  输出的 Target:_CopyOutOfDateSourceItemsToOutputDirectory
  输出的 Target:_CopyOutOfDateSourceItemsToOutputDirectoryAlways
  输出的 Target:_CopyAppConfigFile
  输出的 Target:_CopyManifestFiles
  输出的 Target:_CheckForCompileOutputs
  输出的 Target:_SGenCheckForOutputs
  输出的 Target:UnmanagedRegistration
  输出的 Target:IncrementalClean
  输出的 Target:_CleanGetCurrentAndPriorFileWrites
  输出的 Target:Clean
  输出的 Target:BeforeClean
  输出的 Target:AfterClean
  输出的 Target:CleanReferencedProjects
  输出的 Target:CoreClean
  输出的 Target:_CleanRecordFileWrites
  输出的 Target:CleanPublishFolder
  输出的 Target:PostBuildEvent
  输出的 Target:Publish
  输出的 Target:_DeploymentUnpublishable
  输出的 Target:SetGenerateManifests
  输出的 Target:PublishOnly
  输出的 Target:BeforePublish
  输出的 Target:AfterPublish
  输出的 Target:PublishBuild
  输出的 Target:_CopyFilesToPublishFolder
  输出的 Target:_DeploymentGenerateBootstrapper
  输出的 Target:_DeploymentSignClickOnceDeployment
  输出的 Target:AllProjectOutputGroups
  输出的 Target:BuiltProjectOutputGroup
  输出的 Target:DebugSymbolsProjectOutputGroup
  输出的 Target:DocumentationProjectOutputGroup
  输出的 Target:SatelliteDllsProjectOutputGroup
  输出的 Target:SourceFilesProjectOutputGroup
  输出的 Target:GetCompile
  输出的 Target:ContentFilesProjectOutputGroup
  输出的 Target:SGenFilesOutputGroup
  输出的 Target:GetResolvedSDKReferences
  输出的 Target:CollectReferencedNuGetPackages
  输出的 Target:PriFilesOutputGroup
  输出的 Target:SDKRedistOutputGroup
  输出的 Target:AllProjectOutputGroupsDependencies
  输出的 Target:BuiltProjectOutputGroupDependencies
  输出的 Target:DebugSymbolsProjectOutputGroupDependencies
  输出的 Target:SatelliteDllsProjectOutputGroupDependencies
  输出的 Target:DocumentationProjectOutputGroupDependencies
  输出的 Target:SGenFilesOutputGroupDependencies
  输出的 Target:ReferenceCopyLocalPathsOutputGroup
  输出的 Target:SetCABuildNativeEnvironmentVariables
  输出的 Target:RunCodeAnalysis
  输出的 Target:RunNativeCodeAnalysis
  输出的 Target:RunSelectedFileNativeCodeAnalysis
  输出的 Target:RunMergeNativeCodeAnalysis
  输出的 Target:ImplicitlyExpandDesignTimeFacades
  输出的 Target:GetWinFXPath
  输出的 Target:DesignTimeMarkupCompilation
  输出的 Target:PrepareResourcesForSatelliteAssemblies
  输出的 Target:_AfterCompileWinFXInternal
  输出的 Target:AfterCompileWinFX
  输出的 Target:AfterMarkupCompilePass1
  输出的 Target:AfterMarkupCompilePass2
  输出的 Target:MarkupCompilePass1
  输出的 Target:MarkupCompilePass2
  输出的 Target:_CompileTemporaryAssembly
  输出的 Target:MarkupCompilePass2ForMainAssembly
  输出的 Target:GenerateTemporaryTargetAssembly
  输出的 Target:CleanupTemporaryTargetAssembly
  输出的 Target:AddIntermediateAssemblyToReferenceList
  输出的 Target:SatelliteOnlyMarkupCompilePass2
  输出的 Target:HostInBrowserValidation
  输出的 Target:SplashScreenValidation
  输出的 Target:ResignApplicationManifest
  输出的 Target:SignDeploymentManifest
  输出的 Target:FileClassification
  输出的 Target:MainResourcesGeneration
  输出的 Target:SatelliteResourceGeneration
  输出的 Target:GenerateResourceWithCultureItem
  输出的 Target:CheckUid
  输出的 Target:UpdateUid
  输出的 Target:RemoveUid
  输出的 Target:MergeLocalizationDirectives
  输出的 Target:AssignWinFXEmbeddedResource
  输出的 Target:EntityDeploy
  输出的 Target:EntityDeploySplit
  输出的 Target:EntityDeployNonEmbeddedResources
  输出的 Target:EntityDeployEmbeddedResources
  输出的 Target:EntityClean
  输出的 Target:EntityDeploySetLogicalNames
  输出的 Target:DesignTimeXamlMarkupCompilation
  输出的 Target:InProcessXamlMarkupCompilePass1
  输出的 Target:CleanInProcessXamlGeneratedFiles
  输出的 Target:XamlMarkupCompileReadGeneratedFileList
  输出的 Target:XamlMarkupCompilePass1
  输出的 Target:XamlMarkupCompileAddFilesGenerated
  输出的 Target:XamlMarkupCompileReadPass2Flag
  输出的 Target:XamlTemporaryAssemblyGeneration
  输出的 Target:CompileTemporaryAssembly
  输出的 Target:XamlMarkupCompilePass2
  输出的 Target:XamlMarkupCompileAddExtensionFilesGenerated
  输出的 Target:GetCopyToOutputDirectoryXamlAppDefs
  输出的 Target:ExpressionBuildExtension
  输出的 Target:ValidationExtension
  输出的 Target:GenerateCompiledExpressionsTempFile
  输出的 Target:AddDeferredValidationErrorsFileToFileWrites
  输出的 Target:ReportValidationBuildExtensionErrors
  输出的 Target:DeferredValidation
  输出的 Target:ResolveTestReferences
  输出的 Target:CleanAppxPackage
  输出的 Target:GetPackagingOutputs
  输出的 Target:Restore
  输出的 Target:GenerateRestoreGraphFile
  输出的 Target:_LoadRestoreGraphEntryPoints
  输出的 Target:_FilterRestoreGraphProjectInputItems
  输出的 Target:_GenerateRestoreGraph
  输出的 Target:_GenerateRestoreGraphProjectEntry
  输出的 Target:_GenerateRestoreSpecs
  输出的 Target:_GenerateDotnetCliToolReferenceSpecs
  输出的 Target:_GetProjectJsonPath
  输出的 Target:_GetRestoreProjectStyle
  输出的 Target:EnableIntermediateOutputPathMismatchWarning
  输出的 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
  输出的 Target:DesktopBridgeCopyLocalOutputGroup
  输出的 Target:DesktopBridgeComFilesOutputGroup
  输出的 Target:GetDeployableContentReferenceOutputs
  输出的 Target:DockerResolveAppType
  输出的 Target:DockerUpdateComposeVsGeneratedFiles
  输出的 Target:DockerResolveTargetFramework
  输出的 Target:DockerComposeBuild
  输出的 Target:DockerPackageService
  输出的 Target:ImplicitlyExpandNETStandardFacades
  输出的 Target:_RemoveZipFileSuggestedRedirect
  输出的 Target:SetARM64AppxPackageInputsForInboxNetNative
  输出的 Target:_CleanMdbFiles
  输出的 Target:PreXsdCodeGen
  输出的 Target:XsdCodeGen
  输出的 Target:XsdResolveReferencePath
  输出的 Target:CleanXsdCodeGen
  输出的 Target:_SetTargetFrameworkMonikerAttribute
  输出的 Target:ResolvePackageDependenciesForBuild
  输出的 Target:RunResolvePackageDependencies
  输出的 Target:ResolvePackageAssets
  输出的 Target:FilterSatelliteResources
  输出的 Target:RunProduceContentAssets
  输出的 Target:ReportAssetsLogMessages
  输出的 Target:ResolveLockFileReferences
  输出的 Target:IncludeTransitiveProjectReferences
  输出的 Target:ResolveLockFileAnalyzers
  输出的 Target:_ComputeLockFileCopyLocal
  输出的 Target:ResolveLockFileCopyLocalProjectDeps
  输出的 Target:CheckForImplicitPackageReferenceOverrides
  输出的 Target:CheckForDuplicateItems
  输出的 Target:GenerateBuildDependencyFile
  输出的 Target:GenerateBuildRuntimeConfigurationFiles
  输出的 Target:AddRuntimeConfigFileToBuiltProjectOutputGroupOutput
  输出的 Target:_SdkBeforeClean
  输出的 Target:_SdkBeforeRebuild
  输出的 Target:_ComputeNETCoreBuildOutputFiles
  输出的 Target:_ComputeReferenceAssemblies
  输出的 Target:CoreGenerateSatelliteAssemblies
  输出的 Target:_GetAssemblyInfoFromTemplateFile
  输出的 Target:_DefaultMicrosoftNETPlatformLibrary
  输出的 Target:GetAllRuntimeIdentifiers
  输出的 Target:GenerateAssemblyInfo
  输出的 Target:AddSourceRevisionToInformationalVersion
  输出的 Target:GetAssemblyAttributes
  输出的 Target:CreateGeneratedAssemblyInfoInputsCacheFile
  输出的 Target:CoreGenerateAssemblyInfo
  输出的 Target:GetAssemblyVersion
  输出的 Target:ComposeStore
  输出的 Target:StoreWorkerMain
  输出的 Target:StoreWorkerMapper
  输出的 Target:StoreResolver
  输出的 Target:StoreWorkerPerformWork
  输出的 Target:StoreFinalizer
  输出的 Target:_CopyResolvedOptimizedFiles
  输出的 Target:PrepareForComposeStore
  输出的 Target:PrepforRestoreForComposeStore
  输出的 Target:RestoreForComposeStore
  输出的 Target:ComputeAndCopyFilesToStoreDirectory
  输出的 Target:CopyFilesToStoreDirectory
  输出的 Target:_CopyResolvedUnOptimizedFiles
  输出的 Target:_ComputeResolvedFilesToStoreTypes
  输出的 Target:_SplitResolvedFiles
  输出的 Target:_GetResolvedFilesToStore
  输出的 Target:ComputeFilesToStore
  输出的 Target:PrepRestoreForStoreProjects
  输出的 Target:PrepOptimizer
  输出的 Target:_RunOptimizer
  输出的 Target:RunCrossGen
  输出的 Target:_InitializeBasicProps
  输出的 Target:_GetCrossgenProps
  输出的 Target:_SetupStageForCrossgen
  输出的 Target:_RestoreCrossgen
  输出的 Target:_CheckForObsoleteDotNetCliToolReferences
  输出的 Target:_PublishBuildAlternative
  输出的 Target:_PublishNoBuildAlternative
  输出的 Target:_PreventProjectReferencesFromBuilding
  输出的 Target:PrepareForPublish
  输出的 Target:ComputeAndCopyFilesToPublishDirectory
  输出的 Target:CopyFilesToPublishDirectory
  输出的 Target:_CopyResolvedFilesToPublishPreserveNewest
  输出的 Target:_CopyResolvedFilesToPublishAlways
  输出的 Target:_ComputeResolvedFilesToPublishTypes
  输出的 Target:ComputeFilesToPublish
  输出的 Target:_ComputeNetPublishAssets
  输出的 Target:RunResolvePublishAssemblies
  输出的 Target:FilterPublishSatelliteResources
  输出的 Target:_ComputeCopyToPublishDirectoryItems
  输出的 Target:DefaultCopyToPublishDirectoryMetadata
  输出的 Target:GeneratePublishDependencyFile
  输出的 Target:_ComputeExcludeFromPublishPackageReferences
  输出的 Target:_ParseTargetManifestFiles
  输出的 Target:GeneratePublishRuntimeConfigurationFile
  输出的 Target:DeployAppHost
  输出的 Target:PackTool
  输出的 Target:GenerateToolsSettingsFileFromBuildProperty
  输出的 Target:ResolveApphostAsset
  输出的 Target:ComputeDependencyFileCompilerOptions
  输出的 Target:ComputeRefAssembliesToPublish
  输出的 Target:_CopyReferenceOnlyAssembliesForBuild
  输出的 Target:_HandlePackageFileConflicts
  输出的 Target:_HandlePublishFileConflicts
  输出的 Target:_GetOutputItemsFromPack
  输出的 Target:_GetTargetFrameworksOutput
  输出的 Target:_PackAsBuildAfterTarget
  输出的 Target:_CleanPackageFiles
  输出的 Target:_CalculateInputsOutputsForPack
  输出的 Target:Pack
  输出的 Target:_IntermediatePack
  输出的 Target:GenerateNuspec
  输出的 Target:_InitializeNuspecRepositoryInformationProperties
  输出的 Target:_LoadPackInputItems
  输出的 Target:_GetProjectReferenceVersions
  输出的 Target:_GetProjectVersion
  输出的 Target:_WalkEachTargetPerFramework
  输出的 Target:_GetFrameworksWithSuppressedDependencies
  输出的 Target:_GetFrameworkAssemblyReferences
  输出的 Target:_GetBuildOutputFilesWithTfm
  输出的 Target:_GetTfmSpecificContentForPackage
  输出的 Target:_GetDebugSymbolsWithTfm
  输出的 Target:_AddPriFileToPackBuildOutput
  输出的 Target:_GetPackageFiles

参考资料

  • msbuild - Is there a way to list all the build targets available in a build file? - Stack Overflow

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

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

相关文章:

  • 如何在 csproj 中用 C# 代码写一个内联的编译任务 Task
  • 安装和运行 .NET Core 版本的 PowerShell
  • 让你的 Windows 应用程序在任意路径也能够直接通过文件名执行
  • 如何为你的 Windows 应用程序关联一种或多种文件类型
  • 如何为你的 Windows 应用程序关联 URL 协议,以便在浏览器中也能打开你的应用
  • 四种方法获取可执行程序的文件路径(.NET Core / .NET Framework)
  • 如何使用 MyGet 这个激进的 NuGet 源体验日构建版本的 .NET Standard / .NET Core
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • 为什么 C# 的 string.Empty 是一个静态只读字段,而不是一个常量呢?
  • 透明度叠加算法:如何计算半透明像素叠加到另一个像素上的实际可见像素值(附 WPF 和 HLSL 的实现)
  • C#/.NET 调试的时候显示自定义的调试信息(DebuggerDisplay 和 DebuggerTypeProxy)
  • 详解 .NET 反射中的 BindingFlags 以及常用的 BindingFlags 使用方式
  • 在 csproj 文件中使用系统环境变量的值(示例将 dll 生成到 AppData 目录下)
  • git subtree 的使用
  • 让你的 VSCode 具备调试 C# 语言 .NET Core 程序的能力
  • 2018一半小结一波
  • 230. Kth Smallest Element in a BST
  • Druid 在有赞的实践
  • ECS应用管理最佳实践
  • Java比较器对数组,集合排序
  • Java深入 - 深入理解Java集合
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Otto开发初探——微服务依赖管理新利器
  • python docx文档转html页面
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • 电商搜索引擎的架构设计和性能优化
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 如何利用MongoDB打造TOP榜小程序
  • 双管齐下,VMware的容器新战略
  • 无服务器化是企业 IT 架构的未来吗?
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (27)4.8 习题课
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (论文阅读30/100)Convolutional Pose Machines
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (十五)使用Nexus创建Maven私服
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .Net Core和.Net Standard直观理解
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • ?
  • @Data注解的作用
  • @GlobalLock注解作用与原理解析
  • @javax.ws.rs Webservice注解