У меня есть проект 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 , no target выполняется на всех (но MyTarget
правильно выполняется с Rebuild или при работе с msbuild).Я ожидал бы, что MyCompileTarget
будет выполнен так, чтобы обновился файл file.out
.
Та же проблема возникает, если я использую BeforeBuild
или AfterBuild
вместо PrepareResourcesDependsOn
и т. Д.
Кажется, что инкрементная сборка Visual Studio не запустится, если не будет изменен какой-либо файл в @(Compile)
или @(EmbeddedResource)
.Действительно, если я добавлю следующее
<EmbeddedResource>file.dat</EmbeddedResource>
, инкрементная сборка будет работать как ожидалось (но, очевидно, я не хочу вставлять file.dat
в сгенерированную сборку).
Возможно ли этозаставить Visual Studio включить инкрементную сборку, если file.dat
изменен, и если соответствующий сгенерированный файл старше file.dat
или он не существует?
Примечание: та же проблема возникает при использовании VS2015, с.NET CORE или .NET FRAMEWORK.Кроме того, инкрементная сборка будет запущена, если я изменю файл csharp, и поэтому будет запускать MyTask
, но только если file.dat
новее сгенерированного файла (как и ожидалось).
Заранее спасибо,Фабио.