Visual Studio 如果项目的设置依赖于更改的环境变量,则项目不会自动重建

Visual Studio project is not rebuilt automatically if it's settings depend on the environment variable which is changed

我在 Visual Studio 16.8.3 (Enterprise 2019) 中有一个解决方案。解决方案的项目具有取决于环境变量 OPTIMIZE 值的设置。类似下面(其他设置省略):

<ItemDefinitionGroup Condition="'$(OPTIMIZE)' == 'TRUE'">
  <ClCompile>
    <WholeProgramOptimization>true</WholeProgramOptimization>
  </ClCompile>
</ItemDefinitionGroup>
...
<ItemDefinitionGroup Condition="'$(OPTIMIZE)' != 'TRUE'">
  <ClCompile>
    <WholeProgramOptimization>false</WholeProgramOptimization>
  </ClCompile>
</ItemDefinitionGroup> 

我设置 OPTMIZE=TRUE 并构建解决方案。然后我关闭VS,设置OPTIMIZE=FALSE,打开VS。现在我期待整个解决方案将被重建,因为每个 cpp 的文件编译设置都发生了变化。但是当我按下 Build Solution 时,没有任何反应。当我在解决方案资源管理器中右键单击该项目并按 Build 时,没有任何反应。

但是,当我 select 任何项目中的任何 cpp 文件并对其进行编译时,该项目就会以某种方式理解其所有 cpp 文件的设置已更改。现在,如果我在解决方案资源管理器中右键单击该项目,然后按 Build,将重建整个项目。

我希望项目了解当我更改环境变量的值时设置已更改。我怎样才能实现这种行为?

P.S。当然,如果我知道设置已更改,我可以使用 Rebuild Solution。但是我不想记住 OPTIMIZE 变量的值自上次构建以来是否发生了变化。如果没有更改,我只想按 Build Solution 进行小的增量构建,如果设置发生更改,则进行完整的重建。

VS IDE 无法检测到我身边的小变化,我遇到了与您描述的相同的行为。在我看来,msbuild 将检测您的资源文件与输出文件相比的更改或修改,然后如果输出文件较新,它将构建。

因此,由于您的函数不会向 vcxproj 文件添加任何新信息,只是一些逻辑处理,因此不会在 vcxproj 文件中添加任何节点。

但是,我发现msbuild命令行可以实现你所需要的

所以我想知道VS IDE的up-to-date是否有一些问题无法检测到更改的设置

并且还有最新机制:

你改了OPTIMIZE环境变量,我这边,我把它从FALSE改成了TRUE,保存,重新启动 VS 开发人员命令提示符,然后键入:msbuild xxx\xxx.vcxproj -t:build 并会发现它会根据更改后的 属性 设置构建您的项目。

GLWholeProgramOptimizationtrue

并且新的输出文件是在构建时生成的,这意味着它进行构建。

除了,你还可以。一旦你应该双击蝙蝠,它就会执行构建。

更新

VS IDE 到目前为止无法做到这一点。我很抱歉告诉你。我有 reported the issue to our DC Team,如果我没有详细描述问题,您可以检查它、投票并添加任何评论。它会得到更多 Microsoft 的关注。

到目前为止,您必须使用 msbuild 命令行才能获得所需内容。