gpt4 book ai didi

msbuild - Visual Studio 2012 - MSBuild 增量构建未检测到更改

转载 作者:行者123 更新时间:2023-12-03 22:23:50 24 4
gpt4 key购买 nike

我已经自定义了一个 MSBuild 项目,因此默认目标是一个与“BuildWithExternalReference”类似的新目标。这个新目标调用了另外两个目标;第一个是名为“BuildExternalReference”之类的自定义目标,它使用外部工具构建 DLL。构建的 DLL 是主项目的引用,它是使用正常的“构建”目标构建的。我已经为“BuildExternalReference”目标设置了输入和输出属性,因此输入引用源文件,输出引用生成的 DLL。

在 Visual Studio 2012 和 Visual Studio 2010 中,构建在第一次被调用时正常工作。但是,在后续构建中,如果我更改外部源文件(由“BuildExternalReference”目标输入属性引用),那么 Visual Studio 2012 只会报告“构建:0 成功,0 失败,1 最新,0 已跳过”。 Visual Studio 2010 继续完美运行。此外,使用 MSBuild.exe 从命令行构建也能完美运行。

我知道 Visual Studio 2012 中的构建系统已更改,但我找不到有关增量构建执行方式更改的信息。

Visual Studio 2012 中是否有任何更改导致增量构建发生更改?

这是我正在使用的 csproj 文件的简化版本:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="BuildWithExternalTool" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ExternalSourceFiles Include="..\ExternalSourceFiles\\*\*.cs" />
<ExternalDll Include="..\ExternalSource\External.dll" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Target Name="BuildExternalTool" Inputs="@(ExternalSourceFiles);" Outputs="@(ExternalDll)">
<Exec Command="C:\External\Path\To\Tool.exe" />
</Target>
<Target Name="BuildWithExternalTool">
<CallTarget Targets="BuildExternalTool" />
<CallTarget Targets="Build" />
</Target>
</Project>

2012 年 11 月 1 日更新

这是一个完整的自包含示例,它重现了该问题:

https://skydrive.live.com/redir?resid=EA1DD6ACA92F9EFF!155&authkey=!ANhuqF_rrCgxpLE

这是一个项目的解决方案。 MSBuildIssueExample\MSBuildIssueExample.csproj 文件已经过自定义,因此有一个自定义的默认目标。此默认目标调用自定义目标(称为“ExternalTool”),然后调用默认构建目标。

自定义 ExternalTool 目标会写出一些消息以确保其正常工作,并且还将 MSBuildIssueExample\ExternalTool\Input.txt 文件的内容复制到 MSBuildIssueExample\ExternalTool\Output.txt 文件中。

Input.txt 文件是 ExternalTool 目标的输入,Output.txt 是输出。

要重新创建问题,请按照下列步骤操作:

1)在指定版本的Visual Studio中打开解决方案

2) 构建一次解决方案以确保输出相对于输入是最新的

3) 修改 MSBuildIssueExample\ExternalTool\Input.txt 使其内容与 Output.txt 不匹配

4)重新构建

当您在 Visual Studio 2010 中完成此过程时,将再次调用 ExternalTool 目标,并将 Input.txt 文件复制到 Output.txt 上。

当您在 Visual Studio 2012 中完成此过程时,即使输入比输出新,也不会调用 ExternalTool 目标,因此 Input.txt 的内容不会写入 Output.txt。

但是,如果您执行 Rebuild(而不仅仅是 Build),那么两个版本的 Visual Studio 都会按预期工作。

最佳答案

微软的这个反馈回答了这个问题:

“这是由于 VS 2012 中的更改,其中 C#/VB 项目现在执行“快速更新检查”,允许他们跳过构建,而不是一直强制构建。然而,一个缺点是快速更新检查不考虑自定义目标,这就是未检测到您的增量更改的原因。如果您希望禁用“快速更新检查”,请将“DISABLEFASTUPTODATECHECK”设置为true项目文件中的 MSBuild 属性或作为启动 VS 的环境中的环境变量。”

http://connect.microsoft.com/VisualStudio/feedback/details/770784/visual-studio-2012-msbuild-incremental-build-not-detecting-changes#details

所以基本上这是 Visual Studio 2012 中的一个重大变化,不幸的是似乎没有很好地记录。

关于msbuild - Visual Studio 2012 - MSBuild 增量构建未检测到更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13138820/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com