Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual Studio 2012-MSBuild增量生成未检测到更改_Msbuild_Visual Studio 2012_Incremental Build - Fatal编程技术网

Visual Studio 2012-MSBuild增量生成未检测到更改

Visual Studio 2012-MSBuild增量生成未检测到更改,msbuild,visual-studio-2012,incremental-build,Msbuild,Visual Studio 2012,Incremental Build,我自定义了一个MSBuild项目,因此默认目标是一个名为“BuildWithExternalReference”的新目标。这个新的目标还需要另外两个目标;第一个是一个名为“BuildExternalReference”的自定义目标,它使用外部工具构建DLL。生成的DLL是主项目的参考,它是使用正常的“生成”目标生成的。我已经为“BuildExternalReference”目标设置了输入和输出属性,以便输入引用源文件,输出引用结果DLL 在Visual Studio 2012和Visual St

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

在Visual Studio 2012和Visual Studio 2010中,构建在第一次调用时都能正常工作。但是,在后续生成中,如果我更改了外部源文件(由“BuildExternalReference”目标输入属性引用),则Visual Studio 2012只会报告“生成:0成功,0失败,1最新,0跳过”。VisualStudio2010继续完美地工作。此外,使用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日更新

下面是一个完整的独立示例,再现了这个问题:

这是一个包含一个项目的解决方案。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的两个版本都能按预期工作。

Microsoft的此反馈回答了以下问题:

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


因此,基本上这是Visual Studio 2012中的一个突破性变化,不幸的是,它似乎没有很好的文档记录。

这是一个老问题,但仍然相关。非常感谢您在这里提出它

我想提供我的研究结果

您共享的示例显示了在Visual Studio GUI内部以及通过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>

调试
任意CPU
8.0.30703
2
{4EA8847D-262C-4937-8536-E526E9BAB1C7}
图书馆
性质
MSBuildIssueExample
MSBuildIssueExample
v4.0
512
真的
满的
假的
bin\Debug\
调试;跟踪
促使
4.
pdbonly
真的
bin\Release\
痕迹
促使
4.
自定义目标

<?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>

ExternalTool;$(CompiledPendson)
CleanOutput;$(CleanDependsOn)
假的
假的
那么行为就不同了

Visual Studio GUI继续行为不端,但是,使用devenv构建的命令行确实能够识别输入中的更改!

还要注意,在命令行上运行
msbuild
而不是
devenv
在两个版本中都能正常工作。尽管msbuild还有其他问题

编辑

GUI构建有一个解决方案,它仅适用于外部文件量较小的情况。您可以将它们作为链接添加到项目中,并确保
构建操作
。然后它在GUI中正常工作


虽然,我只检查了
自定义.Targets
,但我非常确定它也将与原始版本一起工作。

扩展mark的编辑,并且由于
-项对我不起作用,下面是一个自定义目标文件的示例,我可以在其他项目中导入该文件,它将文本文件读入正确的ty(我可以在
DefineConstants
属性中使用它),它将文本文件标记为输入f
<?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>