我有一个代码生成器工具,我部分拥有,现在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覆盖。)
这是否会每次构建一次或一次? –
你可以用CoreBuildDependsOn或类似的方式注入你的目标吗? –