当<compile>和<embeddedresource>之外的文件发生更改时,如何避免运行Visual Studio增量构建?

时间:2018-04-25 15:43:31

标签: visual-studio msbuild visual-studio-2017 incremental-build

我有一个VS2017 csharp项目,.csproj文件如下所示:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp2.0</TargetFramework>
    </PropertyGroup>

    <ItemGroup>
        <MyItem Include="file.dat" />
    </ItemGroup>

    <PropertyGroup>
        <PrepareResourcesDependsOn>
            $(PrepareResourcesDependsOn);
            MyCompileTarget
         </PrepareResourcesDependsOn>
        <CoreCompileDependsOn>
            $(CoreCompileDependsOn);
            MyCompileTarget
        </CoreCompileDependsOn>
    </PropertyGroup>

    <Target Name="MyCompileTarget" Inputs="@(MyItem)" Outputs="@(MyItem->'%(FileName).out')">
    ...
    </Target>
 </Project>

其中MyCompileTarget是从file.out生成file.dat的目标(在实际代码中,增量构建目标和属性位于通过NuGet包自动包含的目标文件中)。

问题在于,如果我更改file.dat并按构建,则没有目标执行,(但使用重建或使用msbuild运行时,MyTarget正确执行。我希望执行MyCompileTarget以便更新file.out文件。

如果我使用BeforeBuildAfterBuild代替PrepareResourcesDependsOn等,则会出现同样的问题。

除非@(Compile)@(EmbeddedResource)中的某个文件发生更改,否则Visual Studio增量构建似乎无法启动。的确,如果我添加以下内容

<EmbeddedResource>file.dat</EmbeddedResource>

增量构建按预期工作(但显然我不想将file.dat嵌入生成的程序集中。

如果file.dat被修改,并且相应生成的文件早于file.dat或者它不存在,是否可以强制Visual Studio启用增量构建?

注意:使用带有.NET CORE或.NET FRAMEWORK的VS2015会出现同样的问题。 此外,如果我更改csharp文件,将触发增量构建,因此它将触发MyTask,但仅当file.dat比生成的文件更新时(如预期的那样)。

提前致谢, 法比奥。

1 个答案:

答案 0 :(得分:2)

  

如果修改了file.dat,是否可以强制Visual Studio启用增量构建

您可以在项目文件中将属性DisableFastUpToDateCheck设置为true,以便为Visual Studio构建管理器禁用FastUpToDateCheck

<PropertyGroup>
    <DisableFastUpToDateCheck>True</DisableFastUpToDateCheck>
</PropertyGroup>

检查MSDN有关DisableFastUpToDateCheck的信息:

  

仅适用于Visual Studio的布尔值。 Visual Studio   构建管理器使用名为FastUpToDateCheck的进程来确定   是否必须重建项目以使其保持最新状态。此过程是   比使用MSBuild确定这个更快。 设置   DisableFastUpToDateCheck属性为true允许您绕过Visual   Studio构建管理器并强制它使用MSBuild来确定是否   该项目是最新的

更新

另外,我们可以将UpToDateCheckInput设置为项目:

<UpToDateCheckInput Include="file.dat" />