Как избежать того, что инкрементная сборка Visual Studio не запускается при изменении файлов за пределами <Compile>и <EmbeddedResource>? - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть проект 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 новее сгенерированного файла (как и ожидалось).

Заранее спасибо,Фабио.

1 Ответ

0 голосов
/ 26 апреля 2018

Можно ли заставить Visual Studio включить инкрементную сборку, если файл file.dat изменен

Вы можете установить свойство DisableFastUpToDateCheck в true в файле проекта, чтобы отключитьFastUpToDateCheck для диспетчера сборки Visual Studio:

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

Проверка MSDN о DisableFastUpToDateCheck:

Логическое значение, которое применяется только к Visual Studio. Диспетчер компоновки Visual Studio использует процесс FastUpToDateCheck, чтобы определить, нужно ли перестраивать проект, чтобы он был актуальным. Этот процесс быстрее, чем использование MSBuild для определения этого. Установка для свойства DisableFastUpToDateCheck значения true позволяет обойти диспетчер сборки Visual Studio и заставить его использовать MSBuild для определения актуальности проекта

Обновление:

Кроме того, мы можем установить UpToDateCheckInput для элемента:

<UpToDateCheckInput Include="file.dat" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...