Подтвердить что ты не робот

Что такое инкрементная очистка в msbuild и когда она срабатывает?

Я отлаживаю ошибку в процессе сборки, которая иногда случается, но я не могу напрямую ее воспроизвести. Я использую msbuild с teamcity.

У меня есть иерархия зависимостей:

Some.Interop.dll
   Dependency-> SharedDllABC.dll

SomeService.exe
   Depenendcy-> Some.Interop

Обычно конечная служба exectuable попадает в ее каталог выпуска:

Some.Interop
SharedDllABC.Dll
ServiceExectuable.exe

Однако я могу видеть в наших журналах msbuild, что иногда третичная зависимость удаляется во время инкрементной очистки после того, как все построено, в результате чего:

Some.Interop
ServiceExectuable.exe

Вы можете увидеть его здесь в журнале msbuild:

[src\SomeService\SomeService.csproj] _TimeStampAfterCompile
[12:32:43]:  [src\SomeService\SomeService.csproj] Compile

// some other targets

[12:32:43]:  [src\SomeService\SomeService.csproj] _CopyFilesMarkedCopyLocal
[12:32:43]:      [_CopyFilesMarkedCopyLocal] Copy
[12:32:43]:          [Copy] Copying file from "C:Projects\trunk\src\Some.Interop\bin\Release\Some.Interop.dll" to "bin\Release\Some.Interop.dll".

// some other targets

[src\Project\SomeService\SomeService.csproj] IncrementalClean
[18:54:42]:         [IncrementalClean] Delete
[18:54:42]:             [Delete] Deleting file "C:\Projects\trunk\src\Project\SomeService\bin\Release\SharedDllABC.dll".
[18:54:42]:             [Delete] Deleting file "C:\Projects\trunk\src\Project\SomeServiceService\bin\Release\SharedDllABC.pdb".
[18:54:42]:     [src\Project\SomeService\SomeService.csproj] CoreBuild
[18:54:42]:     [src\Project\SomeService\SomeService.csproj] AfterBuild
[18:54:42]:     [src\Project\SomeService\SomeService.csproj] Build

Это мой прямой вывод msbuild, я просто изменил имена проектов/имена dll в соответствии с моим примером. К тому моменту, когда произошла эта инкрементальная чистка, SomeService.csproj уже построен. Вы можете видеть, что он не копируется. Однако в других журналах msbuild он правильно копируется, а затем инкрементная очистка не удаляет его.

Я думаю, что incrementeal clean от этот пост должен очищать dll, которые были созданы из предыдущих сборников, но это не объясняет, как эта dll не создавался, когда большую часть времени он это делал. В визуальной студии это всегда работает.

Я предполагаю, что просто хочу знать, что именно есть Incremental clean, что заставляет его ударить, и, может быть, какие вещи я должен искать при отладке подобной ситуации (версии сборки, временные метки и т.д.?)

4b9b3361

Ответ 1

Попробуйте следующее:

Добавить

<Target Name="IncrementalClean" />

в файл .targets, который включен во все проекты.

От → https://github.com/Microsoft/msbuild/issues/1054

Ответ 2

Это может быть вызвано ошибкой в MsBuild: https://github.com/Microsoft/msbuild/issues/1054. Исправление предлагается в комментариях: https://github.com/Microsoft/msbuild/issues/1054#issuecomment-406438561

Когда MsBuild определяет, какие элементы копировать из ссылочных проектов, он должен делать это рекурсивно, но не делает это должным образом.

В качестве обходного пути к каждому csproj можно добавить следующее.

<Target Name="ForceAssignProjectConfigurationBeforeSplitProjectReferencesByFileExistence_KLUDGE" BeforeTargets="_SplitProjectReferencesByFileExistence" DependsOnTargets="AssignProjectConfiguration" />

Ответ 3

@Kebabbi рекомендует хорошее исправление, но есть простой способ применить это все файлы CSPROJ - вместо редактирования каждого файла csproj.

Это больше не требуется в MSBuild 15 - https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build?view=vs-2017.

Создайте файл Directory.Build.props и поместите его рядом с файлом SLN.

    <Project>
      <Target 
        Name="ForceAssignProjectConfigurationBeforeSplitProjectReferencesByFileExistence_KLUDGE" 
        BeforeTargets="_SplitProjectReferencesByFileExistence" 
        DependsOnTargets="AssignProjectConfiguration" />
    </Project>