Ответ 1
Попробуйте следующее:
Добавить
<Target Name="IncrementalClean" />
в файл .targets, который включен во все проекты.
Я отлаживаю ошибку в процессе сборки, которая иногда случается, но я не могу напрямую ее воспроизвести. Я использую 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
, что заставляет его ударить, и, может быть, какие вещи я должен искать при отладке подобной ситуации (версии сборки, временные метки и т.д.?)
Попробуйте следующее:
Добавить
<Target Name="IncrementalClean" />
в файл .targets, который включен во все проекты.
Это может быть вызвано ошибкой в 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" />
@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>