我正在调试我的构建过程中偶尔会发生的错误但我不能直接重现它。我正在使用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>
答案 0 :(得分:3)
尝试以下方法:
添加:
<Target Name="IncrementalClean" />
到包含在所有项目中的.targets文件。
答案 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 后,问题就解决了,文件出现在输出文件夹中。