什么是msbuild中的增量清理以及何时触发?

时间:2012-06-28 21:22:12

标签: visual-studio-2010 msbuild teamcity

我正在调试我的构建过程中偶尔会发生的错误但我不能直接重现它。我正在使用msbuild和teamcity。

我有一个依赖关系层次结构:

Some.Interop.dll
   Dependency-> SharedDllABC.dll

SomeService.exe
   Depenendcy-> Some.Interop

通常,最终服务exectuable会进入其发布目录:

Some.Interop
SharedDllABC.Dll
ServiceExectuable.exe

但是我可以在我们的msbuild日志中看到,在构建完所有内容后,有时会在Incremental Clean期间删除三级依赖项,从而导致:

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日志中,它会被正确复制,然后增量清理不会删除它。

我认为来自this post的增量清理应该是清除从以前版本创建的dll,但这并不能解释这个dll在大多数情况下是如何构建的。在视觉工作室,这总是有效。

我想我只是想知道究竟是什么Incremental clean,是什么导致它开始,也许在调试这样的情况时我应该寻找什么样的东西(汇编版本,时间戳等?)< / p>

4 个答案:

答案 0 :(得分:3)

尝试以下方法:

添加:

<Target Name="IncrementalClean" />

到包含在所有项目中的.targets文件。

来自 - &gt; https://github.com/Microsoft/msbuild/issues/1054

答案 1 :(得分:1)

这可能是由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" />

答案 2 :(得分:0)

@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>

答案 3 :(得分:0)

我只是花了几天时间试图用类似的模式来解决这个问题。在我们的例子中,是从输出文件夹中删除的 nuget 文件。

NugetPackage (that drops files in x86/x64 subfolders in output folder)

LibraryA.dll
   Dependency-> NugetPackage

LibraryB.dll
   Dependency-> LibraryA.dll

在我们的例子中,我们有许多解决方案文件,它们以特定顺序作为 msbuild 脚本的一部分构建。 问题是 LibraryB.csproj 包含在两个解决方案文件中。

解决方案 1 构建和输出文件都存在。

Solution2 构建并看到 LibraryB.dll 存在并且是最新的,因此出于某种原因触发了从输出文件夹中删除 NugetPackage 文件的 IncrementalClean。

从解决方案 2 中删除 LibraryB.csproj 后,问题就解决了,文件出现在输出文件夹中。