Visual c++ 如何在使用MsBuild生成多个配置时仅生成修改过的项目

Visual c++ 如何在使用MsBuild生成多个配置时仅生成修改过的项目,visual-c++,msbuild,msbuild-task,incremental-build,Visual C++,Msbuild,Msbuild Task,Incremental Build,我有一个解决方案,它构建了许多项目。其中一些项目生成DLL,以便在其他开发团队之间重新分发(用于集成)。这些DLL由我们自己的应用程序使用,它们主要是为了维护此应用程序而修改和更新的。 我们遇到了这样一个问题,即有时会将不需要的依赖项添加到我们提供给第三方的DLL中。因此,我们在VisualStudio解决方案中创建了一个新配置,它只构建我们提供给第三方的DLL。通过构建此配置,我们能够确保在为这些项目添加任何新的依赖项时,我们的门控签入将失败 <!-- Build only the Da

我有一个解决方案,它构建了许多项目。其中一些项目生成DLL,以便在其他开发团队之间重新分发(用于集成)。这些DLL由我们自己的应用程序使用,它们主要是为了维护此应用程序而修改和更新的。 我们遇到了这样一个问题,即有时会将不需要的依赖项添加到我们提供给第三方的DLL中。因此,我们在VisualStudio解决方案中创建了一个新配置,它只构建我们提供给第三方的DLL。通过构建此配置,我们能够确保在为这些项目添加任何新的依赖项时,我们的门控签入将失败

<!-- Build only the Database Access provider DLLs, if a new, unwanted dependency is added, this MsBuild task will fail -->
<Message Text="Build Database Access Providers"/>
<MSBuild Condition="'$(Configuration)'=='Release'" Properties="Configuration=Database Providers Release; Platform=Mixed Platforms" Projects="@(MySolution)" Targets="Build" BuildInParallel="$(BuildInParallel)" />

<!-- ... -->
<!-- Build all the projects in the solution -->
<MSBuild Properties="Configuration=$(Configuration); Platform=Mixed Platforms" Projects="@(MySolution)" Targets="Build" BuildInParallel="$(BuildInParallel)" />

“Database Providers Release”配置在项目的“Release”配置中构建每个必需的项目

由于对MsBuild的第一次调用在版本配置中构建了各个项目,而完整的构建也在版本配置中构建了各个项目,因此我们认为“构建”target将检测到生成输出是最新的,并且在执行对MsBuild的第二次调用时将第二次跳过重建这些项目。但是,MsBuild脚本将始终在第二次调用MsBuild任务时重新生成项目。这增加了构建时间并影响了构建的代码度量(例如,由于相同的警告报告两次,因此构建警告的数量增加)

如果我只是将解决方案作为一个整体调用两次(在解决方案级别使用相同的构建配置),MsBuild将正确跳过所有解决方案项(即,它执行项目的增量构建)。例如:


如果我在Visual Studio中直接运行两种不同的构建配置,它将正确检测到各种项目已经构建,并将第二次跳过重建它们(即vcxprojs的增量构建设置是正确的)


是否有方法使用MsBuild生成2个解决方案配置(其中每个解决方案配置都使用相同的项目配置),并让MsBuild跳过在第二次生成中遇到的已在第一次生成中生成的项目?

是否可以复制输出?这看起来很奇怪,因为如果所有输出文件(DLL)相对于所有输入文件(源文件)都是最新的,那么CoreComile任务被设置为跳过。
<!-- Build all the projects in the solution -->
<MSBuild Properties="Configuration=$(Configuration); Platform=Mixed Platforms" Projects="@(MySolution)" Targets="Build" BuildInParallel="$(BuildInParallel)" />
<!— This 2nd build will skip every project as MsBuild detects the projects have been built. -->
<MSBuild Properties="Configuration=$(Configuration); Platform=Mixed Platforms" Projects="@(MySolution)" Targets="Build" BuildInParallel="$(BuildInParallel)" />