我有一个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
文件。
如果我使用BeforeBuild
或AfterBuild
代替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
比生成的文件更新时(如预期的那样)。
提前致谢, 法比奥。
答案 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" />