gpt4 book ai didi

visual-studio - 覆盖 .targets 文件中的一个属性

转载 作者:行者123 更新时间:2023-12-04 03:52:49 25 4
gpt4 key购买 nike

背景:我有几个解决方案,其中包含大约 300 个 C++ 项目,其中大部分是共享的。我们正在使用 Visual Studio 2013 并有一个构建脚本,它以正确的顺序编译所有项目,确保提前解决依赖关系。我们的开发/工程团队通过构建脚本构建所有代码,然后尝试使用 Visual Studio 2013 进行调试。

问题: “构建然后调试”过程导致 Visual Studio 告诉我们项目已过期。这源于 ProjectEvaluationFingerprint 属性(在第 39 行 Microsoft.CppBuild.targets 中),包括 $(SolutionDir)在输出文件中。 recommended fix from Microsoft建议删除 $(SolutionDir)从文件中。由于我们的开发人员倾向于在项目之间来回转换,我不想在每个开发人员的机器上手动更改此 .targets 文件(并记住在他们离开项目时将其更改回来)。我想通过为此明确使用 .targets 文件来覆盖 .vcxproj 中的属性。

Microsoft.CppBuild.targets 中的属性如下所示:

<!-- Global up-to-date check support -->
<PropertyGroup>
<ProjectEvaluationFingerprint>$(Configuration)|$(Platform)|$(SolutionDir)|$(ProjectEvaluationFingerprint)</ProjectEvaluationFingerprint>
</PropertyGroup>

一般来说,我一直在关注微软的 How to: Use the Same Target in Multiple Project Files .我创建了一个 .targets 文件( test.targets ),其中包含以下代码(注意 TEST 文本是为了测试构建脚本中的属性评估和在 Visual Studio 中构建项目):
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectEvaluationFingerprint>$(Configuration)|$(Platform)|TEST|$(ProjectEvaluationFingerprint)</ProjectEvaluationFingerprint>
</PropertyGroup>

然后我使用 .vcxproj 中的以下行导入它
<Import Project="..\..\Config\VSPropertySheets\test.targets" />

project.lastbuildstate 文件现在显示为:
#TargetFrameworkVersion=v4.0:PlatformToolSet=v120_xp:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit
Debug|Win32|D:\views\devbranch\Products\SLN\|Debug|Win32|TEST|

它将新的 ProjectEvaluationFingerprint 附加到现有的,因此它不是覆盖的(我可以在一定程度上理解这一点,但我不是 MSBuild 专家)。

问题:如何使用 .targets 文件覆盖这一属性?我是否需要使用 replaceregexp task或者我有更简单的选择吗?

最佳答案

您可以覆盖此属性,但必须注意两件事:

  • 你想要的新设置是这样的:
    <ProjectEvaluationFingerprint>$(Configuration)|$(Platform)|TEST/ProjectEvaluationFingerprint>
    注意删除 $(ProjectEvaluationFingerprint) ,它将包含此标签的先前值
  • 您放置导入的位置很重要:您需要将它放在项目的最后(即在 Microsoft.CppBuild.targets 导入之后)。

  • 具体来说:

    use_custom_fingerprint.targets
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
    <ProjectEvaluationFingerprint>$(Configuration)|$(Platform)</ProjectEvaluationFingerprint>
    </PropertyGroup>
    </Project>

    project.vcxproj
    <Project ...>
    ...
    <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
    <ImportGroup Label="ExtensionTargets">
    </ImportGroup>
    <Import Project="use_custom_fingerprint.targets" />
    </Project>



    请注意,我也尝试了扩展名 .props 并且效果相同。

    注:导入后新导入 Microsoft.CppBuild.targets.$(Platform).user.props不是 足够了,它 必须之后 Microsoft.CppBuild.targets .

    免责声明:在 Visual Studio 2015 中尝试过

    关于visual-studio - 覆盖 .targets 文件中的一个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28631855/

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