当更改<Compile>和<EmbeddedResource>之外的文件时,如何避免Visual Studio增量生成无法运行?

Fab*_*cco 3 msbuild visual-studio incremental-build visual-studio-2017

我有一个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>
Run Code Online (Sandbox Code Playgroud)

其中MyCompileTarget的是,生成一个目标file.outfile.dat(在实际的代码的增量生成目标和特性在经由NuGet包自动包括一个目标文件)。

问题是,如果我改变file.dat并按上构建没有目标,执行在所有(但MyTarget被正确执行与重建或MSBuild的运行时)。我希望MyCompileTarget可以执行以便file.out更新文件。

如果我使用BeforeBuildAfterBuild代替PrepareResourcesDependsOnetc,则会发生相同的问题。

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

<EmbeddedResource>file.dat</EmbeddedResource>
Run Code Online (Sandbox Code Playgroud)

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

是否可以强制Visual Studio启用增量file.dat生成(如果已修改)以及相应的生成文件是否早于file.dat或不存在?

注意:使用VS2015和.NET CORE或.NET FRAMEWORK时,会发生相同的问题。另外,如果我更改csharp文件,则将触发增量生成,因此它将触发MyTask,但前提是它file.dat比生成的文件新(如预期的那样)。

在此先感谢Fabio。

Leo*_*SFT 6

如果file.dat被修改,是否可以强制Visual Studio启用增量生成

您可以在项目文件中将属性设置DisableFastUpToDateChecktrue,以禁用FastUpToDateCheckVisual Studio构建管理器:

<PropertyGroup>
    <DisableFastUpToDateCheck>True</DisableFastUpToDateCheck>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

检查有关DisableFastUpToDateCheck的MSDN

一个仅适用于Visual Studio的布尔值。Visual Studio生成管理器使用名为FastUpToDateCheck的过程来确定是否必须重建项目以保持最新。此过程比使用MSBuild确定此过程更快。将DisableFastUpToDateCheck属性设置为true可让您绕过Visual Studio构建管理器,并强制其使用MSBuild来确定项目是否最新。

更新:

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

<UpToDateCheckInput Include="file.dat" />
Run Code Online (Sandbox Code Playgroud)