我正在调试我的构建过程中偶尔发生的错误,但我无法直接重现它.我正在使用msbuild和teamcity.
我有一个这样的依赖层次结构:
Some.Interop.dll
Dependency-> SharedDllABC.dll
SomeService.exe
Depenendcy-> Some.Interop
Run Code Online (Sandbox Code Playgroud)
通常,最终服务exectuable进入其发布目录:
Some.Interop
SharedDllABC.Dll
ServiceExectuable.exe
Run Code Online (Sandbox Code Playgroud)
但是我可以在我们的msbuild日志中看到,在构建完所有内容后,有时会在Incremental Clean期间删除三级依赖项,从而导致:
Some.Interop
ServiceExectuable.exe
Run Code Online (Sandbox Code Playgroud)
您可以在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
Run Code Online (Sandbox Code Playgroud)
这是我的直接msbuild输出,我刚刚更改了项目名称/ dll名称以匹配我的示例.当这个增量清洁已经发生时,SomeService.csproj已经建成了.你可以看到它没有被复制.但是在其他msbuild日志中,它会被正确复制,然后增量清理不会删除它.
我认为从这篇文章中增加清理应该是清理从以前版本创建的dll,但这并不能解释这个dll在大多数情况下是如何构建的.在视觉工作室,这总是有效.
我想我只是想知道究竟是Incremental clean什么,是什么导致它开始,也许在调试这样的情况时我应该寻找什么样的东西(汇编版本,时间戳等?)
我有一种情况,我想使用MSBuild将输出程序集从一个项目复制到我的目标应用程序的输出目录中,而不需要在MSBuild Copy任务中使用硬编码路径.这是场景:
还有一个Business层,但与我想要解决的MSBuild问题无关.
我的业务层有一个对我的Dal.Interface项目的引用.我的Web项目有一个对Business层的引用,并且就目前而言,执行构建会将业务层和Dal.Interface项目拉入输出.到现在为止还挺好.现在,为了运行Web应用程序,它需要Dal实现.我不想在任何地方引用实现,因为我想对接口强制执行编码而没有引用意味着它不会出现在intellisense等中.
所以我认为我可以通过MSBuild复制操作作为AfterBuild任务来处理这个问题(我在构建Web项目时构建了Dal实现设置,但没有引用).我不想在MSBuild参数中硬编码路径或其他任何东西,所以我试图弄清楚如何从Web应用程序项目的MSBuild文件中引用Dal项目的输出.
所以根据上面提到的项目,我想看到的是:
第3部分是我被困的地方.
我确信这可以做到,我只是找不到帮助的好参考.在此先感谢您的帮助.
我正在实现一个MSBuild框架来驱动构建和部署作为层次结构组织的许多项目.
<Target Name="_CoreBuild">
<MSBuild Projects="@(Project)" Targets="Build" Properties="Configuration=$(Configuration)">
<Output TaskParameter="TargetOutputs" ItemName="CompiledAssemblies" />
</MSBuild>
</Target>
Run Code Online (Sandbox Code Playgroud)
为了实现正确的Clean/Clobber逻辑,我想检索在使用当前选项执行构建时将编译的文件列表.
<Target Name="_CoreClobber" DependsOnTargets="_CoreClean">
<!-- How to retrieve @(CompiledAssemblies) as if we were
building @(Project) and retrieving the @(TargetOutputs) item group.
-->
</Target>
Run Code Online (Sandbox Code Playgroud)
我已经尝试了各种方法,包括创建自定义任务,在其中我构建了一个自定义项目文件,用于导入我想从中检索属性/项目的原始项目.但这并没有给我可靠的价值.
有没有办法检索MSBuild项目的TargetOutputs项目组而不实际执行构建?