Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 重写.targets文件中的一个属性 强>背景:我有几个解决方案,其中大约有300个C++项目,其中大部分是共享的。我们使用的是Visual Studio 2013,有一个构建脚本,可以按照正确的顺序编译所有项目,确保提前解决依赖关系。我们的开发/工程团队通过构建脚本构建所有代码,然后尝试使用Visual Studio 2013进行调试_Visual Studio_Msbuild - Fatal编程技术网

Visual studio 重写.targets文件中的一个属性 强>背景:我有几个解决方案,其中大约有300个C++项目,其中大部分是共享的。我们使用的是Visual Studio 2013,有一个构建脚本,可以按照正确的顺序编译所有项目,确保提前解决依赖关系。我们的开发/工程团队通过构建脚本构建所有代码,然后尝试使用Visual Studio 2013进行调试

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文件

问题:Visual Studio中的“先生成然后调试”过程告诉我们项目已经过时。这源于ProjectEvaluationFingerprint属性(在第39行Microsoft.CppBuild.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)
    ,它将包含此标记的上一个值
  • 放置导入的位置很重要:您希望将其放置在项目的最末尾(即
    Microsoft.CppBuild.targets
    import之后)
具体地说:

使用\u自定义\u指纹。目标

$(配置)|$(平台)

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)