Visual studio 重写.targets文件中的一个属性 强>背景:我有几个解决方案,其中大约有300个C++项目,其中大部分是共享的。我们使用的是Visual Studio 2013,有一个构建脚本,可以按照正确的顺序编译所有项目,确保提前解决依赖关系。我们的开发/工程团队通过构建脚本构建所有代码,然后尝试使用Visual Studio 2013进行调试
问题:Visual Studio中的“先生成然后调试”过程告诉我们项目已经过时。这源于ProjectEvaluationFingerprint属性(在第39行Microsoft.CppBuild.targets中),该属性在输出文件中包含一个Visual studio 重写.targets文件中的一个属性 强>背景:我有几个解决方案,其中大约有300个C++项目,其中大部分是共享的。我们使用的是Visual Studio 2013,有一个构建脚本,可以按照正确的顺序编译所有项目,确保提前解决依赖关系。我们的开发/工程团队通过构建脚本构建所有代码,然后尝试使用Visual Studio 2013进行调试,visual-studio,msbuild,Visual Studio,Msbuild,问题:Visual Studio中的“先生成然后调试”过程告诉我们项目已经过时。这源于ProjectEvaluationFingerprint属性(在第39行Microsoft.CppBuild.targets中),该属性在输出文件中包含一个$(SolutionDir)。建议从文件中删除$(SolutionDir)。由于我们的开发人员倾向于在项目之间来回转换,我不想在每个开发人员的机器上手动更改此.targets文件(请记住在他们离开项目时将其更改回来)。我想通过为此显式使用.targets文件
$(SolutionDir)
。建议从文件中删除$(SolutionDir)
。由于我们的开发人员倾向于在项目之间来回转换,我不想在每个开发人员的机器上手动更改此.targets文件(请记住在他们离开项目时将其更改回来)。我想通过为此显式使用.targets文件来覆盖.vcxproj中的属性
Microsoft.CppBuild.targets中的属性如下所示:
<!-- Global up-to-date check support -->
<PropertyGroup>
<ProjectEvaluationFingerprint>$(Configuration)|$(Platform)|$(SolutionDir)|$(ProjectEvaluationFingerprint)</ProjectEvaluationFingerprint>
</PropertyGroup>
然后使用.vcxproj中的以下行导入它
<Import Project="..\..\Config\VSPropertySheets\test.targets" />
它将新的ProjectEvaluationFingerprint附加到现有的ProjectEvaluationFingerprint上,因此它不会被覆盖(我在某种程度上可以理解这一点,但我不是MSBuild专家)
问题:如何使用.targets文件覆盖这一属性?我需要使用a还是有更简单的选择?我也有同样的问题。我比你进步了一步,但我仍然没有一个完整的解决方案 您现在将旧指纹附加到新指纹而不使用solution dir的原因是您的线路
<ProjectEvaluationFingerprint>$(Configuration)|$(Platform)|TEST|$(ProjectEvaluationFingerprint)</ProjectEvaluationFingerprint>
保留旧指纹,因此只需从ProjectEvaluationFingerprint的值中删除此部分,您的lastbuildstate将具有所需的值
不幸的是,现在(至少对我来说)VisualStudio总是认为指纹是错误的,并且会在每次编译时重新链接项目,而不仅仅是在切换sln文件时
我从道具表中删除了这一行,只要解决方案目录不变,最新的检查就会像预期的那样再次工作。然后,我直接修改了Microsoft.CppBuild.targets,这样做有效:即使在切换解决方案目录时,也不再有“非最新”项目。您可以覆盖此属性,但必须注意两件事:
- 您需要的新设置如下:
注意删除了$(配置)|$(平台)|测试/项目评估指纹>
,它将包含此标记的上一个值$(ProjectEvaluationFingerprint)
- 放置导入的位置很重要:您希望将其放置在项目的最末尾(即
import之后)Microsoft.CppBuild.targets
$(配置)|$(平台)
project.vcxproj
...
请注意,我也尝试了extension.props,这同样有效
注意:导入Microsoft.CppBuild.targets.$(Platform).user.props
后的新导入是不够的,它必须在Microsoft.CppBuild.targets
之后
免责声明:在Visual Studio 2015中尝试此指纹仅在成功生成后写入项目(通常为
$(mediatedirectory)\$(ProjectName).tlogs)的tlog目录中的“.lastbuildstate”文件,然后在快速最新检查期间重新读取以确定其是否已更改。您确定是指纹导致最新检查失败吗?怎么说?嗯,似乎CPS跟踪需要大于4的值。我尝试了31,这是有效的,但产生了一个关于它太高的警告。请参阅我链接到的博客文章。您可以将VS配置为启用名为“CPS”的诊断跟踪,这可以非常准确地告诉您为什么快速更新检查认为您的项目已过时。是的,这是我激活的,抱歉。它告诉我指纹不匹配。奇怪的它应该会起作用。如果手动检查.lastbuiltstate文件,是否有任何行与自定义指纹匹配?
#TargetFrameworkVersion=v4.0:PlatformToolSet=v120_xp:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit
Debug|Win32|D:\views\devbranch\Products\SLN\|Debug|Win32|TEST|
<ProjectEvaluationFingerprint>$(Configuration)|$(Platform)|TEST|$(ProjectEvaluationFingerprint)</ProjectEvaluationFingerprint>
$(ProjectEvaluationFingerprint)