T.W*_*orm 5 c++ msbuild msbuild-task visual-studio
我们之前有过讨论。
搜索 .props 文件数小时后,.prop 和 .targets 中的所有 $(VCTargetsPath) 都被删除,但 Visual Studio 仍然可以正确识别该宏/变量。
通过修改 Microsoft.Cpp.ToolsetLocation.props,可以修改 $(VCTargetsPath),从而导致 VS 无法再创建新项目。
那么,这个宏到底定义在哪里呢?
我相信这个宏不是也不应该被硬编码。
宏 $(VCTargetsPath) 到底在哪里定义的?
实际上,VCTargetsPath属性是在MSBuild系统props或MSBuild文件夹( )targets下的文件中定义的。并且文件是嵌套的并且相互关联。因此,各个属性的值在逐级文件中相互引用, 的值也不例外。C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuildVCTargetsPath
=================================================== =======================
MSBuild实际上相当于软编码。一旦安装了MSBuild,它就会以一堆 dll 和各种已建立的文件props的形式存在targets。props您可以在或文件中以各种方式修改其属性或扩展其功能targets。MSBuild 本身是一个开源构建工具。它并不像你想象的那么一成不变。
=================================================== =======================
实际上是VCTargetsPath在您所说的 msbuild props 文件中定义的Microsoft.Cpp.ToolsetLocation.props。
只是MSBuildtargets中的各种和props文件是嵌套的、相互关联的。被设置为属性的值,而在另一个关联或文件中定义。VCTargetsPath_VCTargetsPathForToolset_VCTargetsPathForToolsettargetsprops
一般来说,用于<import projects="xxxx\xxx.props or targets" />在当前文件targets或props文件中嵌入另一个文件。
而且MSBuild中的文件非常多,如果你想一层层搜索直到找到最终的具体值,可能会显得有点复杂。
另外,是MSBuild用来编译c++项目的VCTargetsPath一些工具的路径。
VS2019中的默认值为C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160.
您可以在文件中编写自定义目标xxx.vcxproj以输出其值。
1)将其写入xxx.vcxproj文件中:
<Target Name="test123" AfterTargets="Build">
<Message Importance="high" Text="$(VCTargetsPath)"></Message>
</Target>
Run Code Online (Sandbox Code Playgroud)
2)然后重建你的项目,你可以看到:
它是MSBuild系统定义的路径。如果轻易改变的话,会导致项目编译失败,除非你有一套类似MSBuild的自定义系统来构建C++项目,然后放到新的路径下,让新的路径覆盖VCTargetsPath属性。
另外,我很好奇你为什么要找到最低VCTargetPath值。如果你想了解它的原理,上面的答案已经解释了。
如果你想覆盖它的值,你可以创建一个直接调用的环境系统变量VCTargetsPath,然后将其值设置为新的。
重新启动VS以启用这样的新值。这比修改文件容易得多targets。