gpt4 book ai didi

每个项目的 msbuild Directory.build.props 级联?

转载 作者:行者123 更新时间:2023-12-05 02:56:45 25 4
gpt4 key购买 nike

执行摘要:我想根据仅在构建管道后期出现的条件在属性组中设置属性,并且正在寻找一种方法来更早地解决这个问题。

我有一个相当简单的 Directory.build.props 文件

<Project>

<PropertyGroup>
<MyMode>Default</MyMode>
</PropertyGroup>

<!-- This one overrides the default group above -->
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<MyMode>Changed to Debug</MyMode>
</PropertyGroup>

<!-- This one is not applied -->
<PropertyGroup Condition=" '$(TargetFrameworkVersion)' == 'v4.7.2' ">
<MyMode>Framework</MyMode>
</PropertyGroup>


<Target Name="Stats" AfterTargets="Build">
<Message Importance="High" Text="::::: Mode set to $(MyMode)" />
<Message Importance="High" Text="::::: Target Framework set to $(TargetFrameworkVersion)" />
</Target>

</Project>

以及一个简单的项目结构

E:.
│ Directory.build.props
│ MSBuild_Test.sln

├───ConsoleAppNet
│ App.config
│ ConsoleAppNet.csproj
│ Program.cs

└───MSBuild_Test
Class1.cs
LibStandard.csproj

LibStandard 是一个 .net 标准库,ConsoleAppNet 是一个 .net 框架项目,它也具有对 LibStandard 的构建依赖性

当我执行上面的 msbuild 脚本时,我得到了这个输出

  LibStandard -> E:\temp\MSBuild_Test\MSBuild_Test\bin\Debug\netstandard2.0\LibStandard.dll
::::: Mode set to Changed to Debug
::::: Target Framework set to v2.0
ConsoleAppNet -> E:\temp\MSBuild_Test\ConsoleAppNet\bin\Debug\ConsoleAppNet.exe
::::: Mode set to Changed to Debug
::::: Target Framework set to v4.7.2

如您所见,控制台输出本应触发属性组,条件是 MyModeFramework,但没有成功。这个从未匹配过:

  <PropertyGroup Condition=" '$(TargetFrameworkVersion)' == 'v4.7.2' ">
<MyMode>Framework</MyMode>
</PropertyGroup>

有没有一种好的方法可以根据上述条件在加载期间应用PropertyGroups

我知道我可以在目标中放置 PropertyGroup 覆盖,例如:

  <Target Name="TooLate" BeforeTargets="BeforeBuild" Condition=" '$(TargetFrameworkVersion' == 'v4.7.2' ">
<PropertyGroup >
<MyMode>Framework</MyMode>
</PropertyGroup>
</Target>

它也能正确执行,但此时我无法设置重要的其他变量。

我的意图是根据不同的条件重定向输出目录。当我在目标中设置 $(OutputPath) 时,已经太晚了。该项目忽略此项目的整个构建的此输出:

  <Target Name="TooLate" BeforeTargets="BeforeBuild" Condition=" '$(TargetFrameworkVersion)' == 'v4.7.2' ">
<PropertyGroup >
<OutputPath>New_Output_Directory</OutputPath>
</PropertyGroup>
</Target>

我什至可以回显 OutputPath 变量,它指向正确的值,但构建使用旧值而不重定向输出。

最佳答案

高五,我找到了所有即将到来的 Samuels 询问同一问题的解决方案。

快速回答

在导入 Directory.build.props 时,尚未导入其他属性(例如 TargetFramework),默认。这就是对它们的检查失败的原因。请改用 Directory.build.targets!

  • Directory.build.props 非常很早就导入,允许您在开始时设置属性
  • Directory.build.targets导入,允许您自定义构建链

资源

这里有一些关于 msbuild 的非常有用的页面

说明

这是来自 paragraph on the customization page 的引述(只要当前文件还活着......)

Import order

Directory.Build.props is imported very early in Microsoft.Common.props, and properties defined later are unavailable to it. So, avoid referring to properties that are not yet defined (and will evaluate to empty).

Directory.Build.targets is imported from Microsoft.Common.targets after importing .targets files from NuGet packages. So, it can override properties and targets defined in most of the build logic, but sometimes you may need to customize the project file after the final import.

通过阅读本文,目标的含义有些模糊,但 Directory.Build.targets 是覆盖属性和使用条件检查的最佳位置。

关于每个项目的 msbuild Directory.build.props 级联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60202673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com