的Visual Studio 2012 - MSBuild的增量编译未检测到变化(Visual

2019-07-03 10:34发布

因此,默认目标是同样命名为“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的工作,这两个版本。

Answer 1:

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

“这是因为在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重大更改,不幸的是似乎并没有被记录得非常好。



Answer 2:

这是一个老问题,但仍然具有现实意义。 非常感谢您在这里养它。

我想提供我的研究成果。

你分享的例子显示异常行为时,双方的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 ActionNone 。 然后,它在GUI中正常工作。

虽然,我只用了检查Custom.Targets ,但我敢肯定它会与原来的版本,以正常工作。



Answer 3:

为了扩展标记的编辑,因为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



文章来源: Visual Studio 2012 - MSBuild incremental build not detecting changes