内容简介:我之前写过一些改变 MSBuild 编译过程的一些博客,包括利用 Microsoft.NET.Sdk 中各种自带的 Task 来执行各种各样的编译任务。更复杂的任务难以直接利用自带的 Task 实现,需要自己写 Task。本文将编写一个内联的编译任务,获取当前编译环境下的所有编译目标(Target)。获取所有的这些 Target 对我们调试一些与 MSBuild 或编译相关的问题时可能带来一些帮助。编写纯 C# 版本编译任务获取所有编译目标(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 文件贴出来了。如果你希望在你的项目中去使用,可以只复制 UsingTask
和 Target
两个部分。
<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 的输出:
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
参考资料
本文会经常更新,请阅读原文: https://walterlv.com/post/write-a-msbuild-inline-task-for-getting-all-targets.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接:https://walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (walter.lv@qq.com) 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 提升go编译器内联程度
- 内联函数和编译器对 Go 代码的优化
- 如何在 csproj 中用 C# 代码写一个内联的编译任务 Task
- iframe内联框架之巧妙跨域
- 智能合约基础语言(十):Solidity内联汇编
- 重学前端:块级元素与内联元素
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
程序员修炼之道(影印版)
Andrew Hunt、David Thomas / 中国电力出版社 / 2003-8-1 / 39.00
本书直击编程陈地,穿过了软件开发中日益增长的规范和技术藩篱,对核心过程进行了审视——即根据需求,创建用户乐于接受的、可工作和易维护的代码。本书包含的内容从个人责任到职业发展,直至保持代码灵活和易于改编重用的架构技术。从本书中将学到防止软件变质、消除复制知识的陷阱、编写灵活、动态和易适应的代码、避免出现相同的设计、用契约、断言和异常对代码进行防护等内容。一起来看看 《程序员修炼之道(影印版)》 这本书的介绍吧!