因此,默认目标是同样命名为“BuildWithExternalReference”新的目标我已经定制MSBuild项目。 此新目标调用其他两个目标; 首先是所谓的像“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。
但是,如果你不重建(而不是仅仅建立),则如预期的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重大更改,不幸的是似乎并没有被记录得非常好。
这是一个老问题,但仍然具有现实意义。 非常感谢您在这里养它。
我想提供我的研究成果。
你分享的例子显示异常行为时,双方的Visual Studio界面内,由Devenv命令行构建( devenv .\MSBuildIssueExample.sln /build
)
但是,如果您有以下替换您的csproj文件:
MSBuildIssueExample.csproj
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{4EA8847D-262C-4937-8536-E526E9BAB1C7}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>MSBuildIssueExample</RootNamespace>
<AssemblyName>MSBuildIssueExample</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Class1.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="Custom.Targets" />
</Project>
Custom.Targets
<?xml version="1.0" encoding="utf-8" ?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<CompileDependsOn>ExternalTool;$(CompileDependsOn)</CompileDependsOn>
<CleanDependsOn>CleanOutput;$(CleanDependsOn)</CleanDependsOn>
</PropertyGroup>
<ItemGroup>
<ExternalToolInputs Include="ExternalTool\Input.txt">
<InProject>false</InProject>
</ExternalToolInputs>
<ExternalToolOutputs Include="ExternalTool\Output.txt">
<InProject>false</InProject>
</ExternalToolOutputs>
</ItemGroup>
<Target Name="ExternalTool" Inputs="@(ExternalToolInputs)" Outputs="@(ExternalToolOutputs)">
<Message Text="ExternalTool target start, copying input file over output..." />
<Copy SourceFiles="@(ExternalToolInputs)" DestinationFiles="@(ExternalToolOutputs)" />
<Message Text="ExternalTool target end, copy successful" />
</Target>
<Target Name="CleanOutput">
<Delete Files="@(ExternalToolOutputs)" ContinueOnError="true" />
</Target>
</Project>
然后行为是不同的!
Visual Studio的GUI继续胡作非为, 然而,在命令行建立与devenv的不识别输入的变化!
还要注意,运行msbuild
命令行,而不是在devenv
两个版本中正常工作。 虽然MSBuild的还有其他问题...
编辑
有用于GUI构建,这是仅适用时的外部文件的量小的溶液。 您将它们添加到项目中的链接,并确保Build Action
为None
。 然后,它在GUI中正常工作。
虽然,我只用了检查Custom.Targets
,但我敢肯定它会与原来的版本,以正常工作。
为了扩展标记的编辑,因为None
-items没有工作对我来说,这里有一个自定义的目标文件,我可以在其他项目中导入的一个例子,它读取文本文件转换成一个属性(我可以在再使用DefineConstants
属性),以及将标记文本文件作为输入CoreCompile
目标:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<CommonDefines>$([System.IO.File]::ReadAllText('$(SolutionDir)\_meta\definesFlags.txt'));$(CommonDefines)</CommonDefines>
</PropertyGroup>
<ItemGroup>
<CustomAdditionalCompileInputs Include="$(SolutionDir)\_meta\definesFlags.txt" />
</ItemGroup>
</Project>
CustomAdditionalCompileInputs
-items被作为由输入Microsoft.Csharp.Core.targets
。