我有一个 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
比生成的文件更新(如预期)。提前致谢, 法比奥。
如果 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" />
相反,请确保最新检查了解项目中的项目以及它们与构建的关系。为此,您可以将两种项目添加到您的项目中:
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