Ian*_*son 14 msbuild incremental-build visual-studio-2012
我已经定制了一个MSBuild项目,因此默认目标是一个名为"BuildWithExternalReference"的新目标.这个新目标调用另外两个目标; 第一个是自定义目标,称为"BuildExternalReference",它使用外部工具构建DLL.构建的DLL是主项目的引用,它是使用普通的"Build"目标构建的.我已经为'BuildExternalReference'目标设置了Inputs和Outputs属性,因此Inputs引用源文件,输出引用生成的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>
Run Code Online (Sandbox Code Playgroud)
2012年11月1日更新
这是一个完整的自包含示例,可以重现该问题:
https://skydrive.live.com/redir?resid=EA1DD6ACA92F9EFF!155&authkey=!ANhuqF_rrCgxpLE
这是一个项目的解决方案.已自定义MSBuildIssueExample\MSBuildIssueExample.csproj文件,因此存在自定义默认目标.此默认目标调用自定义目标(称为"ExternalTool"),然后调用默认的Build目标.
自定义ExternalTool目标会写出一些消息以确保它正常工作,并且还会通过MSBuildIssueExample\ExternalTool\Output.txt文件复制MSBuildIssueExample\ExternalTool\Input.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都按预期工作.
Ian*_*son 11
来自Microsoft的反馈回答了以下问题:
"这是由于VS 2012的变化,C#/ VB项目现在进行"快速最新检查",允许他们跳过构建,而不是一直强制构建.但是,一个缺点是快速最新检查未考虑自定义目标,这就是未检测到增量更改的原因.如果您希望禁用"快速更新检查",请将"DISABLEFASTUPTODATECHECK"设置为true项目文件中的MSBuild属性,或者作为从VS启动的环境中的环境变量."
所以基本上这是Visual Studio 2012中的一个重大变化,遗憾的是,它似乎没有被很好地记录.
| 归档时间: |
|
| 查看次数: |
6240 次 |
| 最近记录: |