7

我有一个 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.outfrom的目标在哪里file.dat(在实际代码中,增量构建目标和属性位于通过 NuGet 包自动包含的目标文件中)。

问题是,如果我更改file.dat并按下Build,则根本不会执行任何目标(但使用Rebuild或使用 msbuild 运行时正确执行)。我希望执行该文件以便更新文件。MyTargetMyCompileTargetfile.out

BeforeBuild如果我使用orAfterBuild代替PrepareResourcesDependsOnetc ,也会出现同样的问题。

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

<EmbeddedResource>file.dat</EmbeddedResource>

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

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

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

在此先感谢,法比奥。

4

2 回答 2

6

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

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

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

查看MSDN关于 DisableFastUpToDateCheck:

仅适用于 Visual Studio 的布尔值。Visual Studio 生成管理器使用称为 FastUpToDateCheck 的过程来确定是否必须重新生成项目才能保持最新状态。此过程比使用 MSBuild 来确定这一点要快。将 DisableFastUpToDateCheck 属性设置为 true 可以绕过 Visual Studio 构建管理器并强制它使用 MSBuild 来确定项目是否是最新的

更新:

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

<UpToDateCheckInput Include="file.dat" />
于 2018-04-26T09:56:45.927 回答
1

禁用 VS 快速更新检查将使您的构建速度慢得多。不要这样做!

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

  • UpToDateCheckInput用于输入
  • UpToDateCheckBuilt用于输出

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

<PropertyGroup>
  <UpToDateCheckBuilt Original="@(MyItem)" Include="@(MyItem->'%(FileName).out')">
</PropertyGroup>

有关更多信息,请参阅文档:

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

于 2021-10-11T21:39:36.940 回答