微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在多目标构建中使用 $(OutputPath)?

如何解决在多目标构建中使用 $(OutputPath)?

现在在 sdk 样式项目中编写自定义 Target 以在多目标构建的上下文中对 $(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>

这在没有多目标的 sdk 样式项目中运行良好,因为 $(OutputPath) 设置为 bin\debug,这确实是 Foo.exe 所在的位置。但是上面的 ItemGroup 在 AppendTargetFrameworkToOutputPath 执行其工作以将 $(OutputPath) 设置为 bin\debug\net48 之前被评估。所以现在我的 ItemGroup 仍在 bin\debug 而不是 bin\debug\net48 中寻找 Foo.exe(即使在定义 $(TargetFramework) 的内部构建中也是如此)。作为依赖 AppendTargetFrameworkToOutputPath 的替代方法,我尝试在 Directory.Build.props 中将 $(OutputPath) 自己定义为 bin$(Configuration)$(TargetFramework) 但因为 $(TargetFramework) 直到我的 csproj 内容之后才由 sdk 设置被评估会出现同样的问题(我的 ItemGroup 中使用 $(OutputPath) 的路径评估为 bin\debug\)。任何 PropertyGroup 项显然也会出现同样的问题。

我可以设计一些解决方法,但它们看起来都有些笨拙(例如定义一个前面的目标,它的唯一工作是为未来目标的输入/输出定义 ItemGroups,以便 $(OutputPath) 在它运行时完全构建) .我很惊讶多目标的文档似乎没有提到使用此功能真的会干扰您在构建过程中引用构建工件的能力?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。