Msbuild 在多目标生成中使用$(OutputPath)?

Msbuild 在多目标生成中使用$(OutputPath)?,msbuild,.net-5,multitargeting,Msbuild,.net 5,Multitargeting,现在,在sdk样式的项目中编写自定义目标以在多目标构建上下文中对$(OutputPath)中的文件执行操作的规范方法是什么?我正在尝试将我们的构建多目标地迁移到net5,我很惊讶这是多么混乱。作为构建的一部分,我们有各种目标需要达到$(OutputPath)以复制文件或运行EXE等。例如,像这样的目标: <TargetFrameworks>net48;net5</TargetFrameworks> <AppendTargetFrameworkToOutputPat

现在,在sdk样式的项目中编写自定义目标以在多目标构建上下文中对$(OutputPath)中的文件执行操作的规范方法是什么?我正在尝试将我们的构建多目标地迁移到net5,我很惊讶这是多么混乱。作为构建的一部分,我们有各种目标需要达到$(OutputPath)以复制文件或运行EXE等。例如,像这样的目标:

<TargetFrameworks>net48;net5</TargetFrameworks> 
<AppendTargetFrameworkToOutputPath>true</AppendTargetFrameworkToOutputPath>
...
<ItemGroup>
    <MyTargetInputs Include="$(OutputPath)\Foo.exe">
</ItemGroup>
<Target Name="DoPostBuildStuff" AfterTargets="Build" Inputs="@(MyTargetInputs)" Outputs="@(MyTargetOutputs)">
    ...
</Target>
net48;网络5
真的
...
...
这在sdk样式的项目中工作得很好,没有多目标,因为$(OutputPath)被设置为bin\debug,这实际上就是Foo.exe所在的位置。但是使用上述方法,在AppendTargetFrameworkToOutputPath将$(OutputPath)设置为bin\debug\net48之前,会对ItemGroup进行计算。因此,现在我的项目组仍然在bin\debug而不是bin\debug\net48中查找Foo.exe(即使在定义了$(TargetFramework)的内部版本中也是如此)。作为依赖AppendTargetFrameworkToOutputPath的替代方法,我尝试在Directory.Build.props中将$(OutputPath)自己定义为bin$(Configuration)$(TargetFramework),但由于sdk在计算csproj内容之后才设置$(TargetFramework),因此出现了相同的问题(我的项目组中使用$(OutputPath)的路径)计算到bin\debug\)。显然,任何PropertyGroup项目也会出现同样的问题


我可以设计一些变通方法,但它们似乎都有点粗糙(例如定义一个前一个目标,其唯一任务是为未来目标的输入/输出定义项目组,以便$(OutputPath)在运行时完全构建)。我感到惊讶的是,多目标文档似乎没有提到,使用此功能确实会影响您在构建过程中引用构建工件的能力?

您可以尝试创建将在
DoPostBuildStuff
之前进行评估的目标,像
是的,这是我可用的解决方法之一,但在多目标设定被认为是简单的更改为之后,对我在100多个项目中拥有的几乎每个自定义目标(大多数只是试图将内容复制到$(OutputPath))执行此操作感觉非常烦人。这真的是多目标构建的规范选项吗?我不认为我在使用达到$(OutputPath)的生成后任务时做了什么特别不寻常的事情。您可以在存储库的根目录中创建任务
Directory.build.targets
,它将自动执行,您只需在单个项目中分配
MyTargetInputs
。但这可能很棘手,因为改变了路径,您需要使用