gpt4 book ai didi

visual-studio - 如何在从 Visual Studio 的项目文件导入中使用 Directory.Build.props 中的属性

转载 作者:行者123 更新时间:2023-12-03 23:52:40 33 4
gpt4 key购买 nike

我有这种情况:

我在项目目录中有一个 .proj 文件:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Compile Include="PQExtensionTest.pq">
<SubType>Code</SubType>
</Compile>
<Content Include="PQExtensionTest.query.pq">
<SubType>Code</SubType>
</Content>
</ItemGroup>
<!-- <Import Project="..\Directory.Build.props" /> -->
<Import Project="$(aProperty)add.targets" />
</Project>

在解决方案目录(来自项目目录的..\)中,我有文件 Directory.Build.props:
<Project DefaultTargets="BuildExtension" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<aProperty>$(MSBuildProjectDirectory)/Subdir/</aProperty>
</PropertyGroup>
</Project>

在项目目录中,我有子目录“Subdir”,其中有文件 add.targets,其中包含我需要的所有目标(不要在此处显示它包含的内容,因为它与问题无关)。

所以上面都有这个文件夹结构:
Solution directory
Directory.Build.props
Project Directory
Project.mproj
Subdir
add.targets

准备好以上所有内容,我预计 aProperty 将在导入之前启动,并且 add.targets 的导入将毫无问题地发生。但是我收到未找到导入项目的错误,并且我在错误消息中看到 MSBuild 尝试从项目目录导入,而不是从子目录 Subdir 导入。

如果我取消注释这一行:
<Import Project="..\Directory.Build.props" />

一切正常。

对我这种行为的唯一合理解释是 aProperty 在导入时为空,因为显式导入发生在隐式导入之前。

在 Visual Studio 中工作时,有没有办法强制 MSBuild 在任何其他导入之前隐式导入 Directory.Build.props?

最佳答案

“在 Visual Studio 中”

For C# and VB language project, we don't need to import Directory.Build.props manually or force it before other imports.



在VS中新建一个项目(C#或者VB),打开它的proj文件,可以看到格式如下:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
...
</PropertyGroup>
<ItemGroup>
...
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

每次创建新的 C# 或 VB 项目时, <Project> 内的顶行节点是 Import project="Microsoft.Common.props" ,我们可以从 this document 中找到这句话:

当 MSBuild 运行时, Microsoft.Common.props在目录结构中搜索 Directory.Build.props文件(和 Microsoft.Common.targets looks for Directory.Build.targets )。 如果找到,则导入该属性。

所以在visual studio中,我们不需要在其他导入之前强制它。它总是在 import Microsoft.Common.props之后调用。 ,并且由于 import Microsoft.Common.props默认情况下始终是项目节点的第一行,Dir​​ectory.Build.Targets 总是在 Microsoft.Common.props 之后和其他之前隐式导入。

注意:此功能只支持C#和VB,因为只有这两种项目会导入proj文件中的Microsoft.Common.Props。

And for other kinds of projects, just like your .mproj or .vcxproj(C++), this feature(Directory.Build.props) is not supported yet.



因此 Directory.Build.Targets 或 .props 与任何自定义 .props 相同。 Directory.Build.Targets 和 anyName.props 之间没有区别。

这样,要读取其中的值,我们必须使用 import project手动调用它。 这就是为什么在您取消注释行 之前构建无法成功的原因。 : <Import Project="..\Directory.Build.props" />

关于visual-studio - 如何在从 Visual Studio 的项目文件导入中使用 Directory.Build.props 中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55213216/

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