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

问题描述 投票:0回答:2

我有一个 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
并按 Build,则根本不会执行 目标(但 MyTarget
 使用 
Rebuild 或使用 msbuild 运行时可以正确执行)。我希望执行 MyCompileTarget
 以便更新 
file.out
 文件。

如果我使用

BeforeBuild

AfterBuild
 而不是 
PrepareResourcesDependsOn
 等,也会出现同样的问题

除非

@(Compile)

@(EmbeddedResource)
 中的某些文件发生更改,否则 Visual Studio 增量构建似乎不会启动。事实上,如果我添加以下内容

<EmbeddedResource>file.dat</EmbeddedResource>
增量构建按预期工作(但显然我不想将 

file.dat

 嵌入到生成的程序集中)。

如果修改了

file.dat

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

注意:使用 VS2015、.NET CORE 或 .NET FRAMEWORK 也会出现同样的问题。 另外,如果我更改 csharp 文件,将触发增量构建,因此它将触发

MyTask

,但前提是 
file.dat
 比生成的文件更新(如预期)。

提前致谢, 法比奥。

visual-studio msbuild visual-studio-2017 incremental-build
2个回答
9
投票
如果 file.dat 被修改,是否可以强制 Visual Studio 启用增量构建

您可以在项目文件中将属性

DisableFastUpToDateCheck

 设置为 
true
,以禁用 Visual Studio 构建管理器的 
FastUpToDateCheck

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

检查

MSDN有关DisableFastUpToDateCheck的信息:

仅适用于 Visual Studio 的布尔值。

视觉工作室 构建管理器使用名为 FastUpToDateCheck 的过程来确定 是否必须重建项目才能保持最新状态。 此过程是 比使用 MSBuild 更快地确定这一点。 设置 将 DisableFastUpToDateCheck 属性设置为 true 可让您绕过 Visual Studio 构建管理器并强制它使用 MSBuild 来确定是否 该项目是最新的

更新:

此外,我们还可以将

UpToDateCheckInput

 设置为项目:

<UpToDateCheckInput Include="file.dat" />
    

2
投票
禁用 VS 快速更新检查会让你的构建速度变慢。别这样做!

相反,请确保最新检查了解项目中的项目以及它们与构建的关系。为此,您可以将两种项目添加到您的项目中:

  • UpToDateCheckInput
     用于输入
  • UpToDateCheckBuilt
     用于输出
在您的情况下,您需要第二个选项,因为既有输入又有输出。您需要确保如果删除输出,它会被重建。

<ItemGroup> <UpToDateCheckBuilt Original="@(MyItem)" Include="@(MyItem->'%(FileName).out')"> </ItemGroup>
有关更多信息,请参阅文档:

https://github.com/dotnet/project-system/blob/main/docs/up-to-date-check.md

© www.soinside.com 2019 - 2024. All rights reserved.