2017-10-10 187 views
0

我有一个代码生成器工具,我部分拥有,现在csproj文件可以列出它们中的多个目标框架并构建它们全部,我想弄清楚如何使MSBuild目标只做代码生成每运行一次构建,无论列出了多少个目标框架,并且每个目标框架的编译都要等到代码生成完成。如何制作仅在TargetFrameworks标记中的每个框架运行一次的目标之前运行一次而不是运行一次的MSBuild目标?

我目前拥有TargetFramework特定值的条件。例如,Condition="'netstandard2.0' == '$(TargetFramework)'"

这可避免同时为每个目标框架启动代码生成工具,然后在进程尝试创建/更新相同文件时获取访问被拒绝错误。

但是,其他目标框架正确地尝试编译而不等待代码生成完成,并且在没有该代码存在的情况下失败。

我希望每次构建项目时都只发生一次代码生成,并且每个目标框架的编译仅在完成后才开始。

每次构建运行时都需要运行,以防输入发生变化并生成不同的代码。

注意:目前我忽略了使用#if FrameworkSpecificDefine将不同的输入代码添加到代码生成器的情况,这样不同的目标框架会导致代码生成器的不同输出。目前,我正在考虑代码生成器的输出在所有目标框架中都是相同和有效的。

更新:寻找出现这种情况的MSBuild分成TargetFramework特定之前版本,我可以再勾之前建立一个目标之后,我在VS看到这个详细的生成输出:

1>Target _SetBuildInnerTarget: 
1>Target _ComputeTargetFrameworkItems: 
1>Target DispatchToInnerBuilds: 
1> Using "MSBuild" task from assembly "Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". 
1> Task "MSBuild" 
1> Additional Properties for project "ProjectA.csproj": 
1>  TargetFramework=netstandard2.0 
1> Additional Properties for project "ProjectA.csproj": 
1>  TargetFramework=net47 

我然后将我的目标设置为BeforeTargets="DispatchToInnerBuilds",它在专门设置TargetFramework的单个构建之前运行,似乎完全符合我的需求。

(添加到BuildDependsOn属性似乎不再工作:Add a msbuild task that runs after building a .NET Core project in Visual Studio 2017 RC;我怀疑Microsoft.Common.targets稍后以新的csproj格式进行评估,并且任何附加到您在项目文件中执行的属性被Microsoft.Common.targets覆盖。)

+0

这是否会每次构建一次或一次? –

+0

你可以用CoreBuildDependsOn或类似的方式注入你的目标吗? –

回答

0

虽然有些目标只能在内部构建中运行,例如当您使用BeforeTargets="BeforeBuild"时,外部版本还定义了IsCrossTargetingBuild变量,以指示当前正在运行的构建是分派到内部构建的外部构建,并且是调整目标的首选方式。

因此,您可以像Condition="'$(IsCrossTargetingBuild)' == 'true'"那样调整目标以确保目标仅针对外部构建运行。

相关问题