相关疑难解决方法(0)

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

我正在调试我的构建过程中偶尔发生的错误,但我无法直接重现它.我正在使用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 teamcity visual-studio-2010

19
推荐指数
1
解决办法
3069
查看次数

MSBuild将另一个项目的副本输出复制到当前项目的输出中

我有一种情况,我想使用MSBuild将输出程序集从一个项目复制到我的目标应用程序的输出目录中,而不需要在MSBuild Copy任务中使用硬编码路径.这是场景:

  • 项目A - Web应用程序项目
  • 项目B - Dal接口项目
  • 项目C - 达尔实施项目

还有一个Business层,但与我想要解决的MSBuild问题无关.

我的业务层有一个对我的Dal.Interface项目的引用.我的Web项目有一个对Business层的引用,并且就目前而言,执行构建会将业务层和Dal.Interface项目拉入输出.到现在为止还挺好.现在,为了运行Web应用程序,它需要Dal实现.我不想在任何地方引用实现,因为我想对接口强制执行编码而没有引用意味着它不会出现在intellisense等中.

所以我认为我可以通过MSBuild复制操作作为AfterBuild任务来处理这个问题(我在构建Web项目时构建了Dal实现设置,但没有引用).我不想在MSBuild参数中硬编码路径或其他任何东西,所以我试图弄清楚如何从Web应用程序项目的MSBuild文件中引用Dal项目的输出.

所以根据上面提到的项目,我想看到的是:

  1. Web应用程序构建开始了
  2. 所有必需的项目都已构建(已配置,因此已完成)
  3. MSBuild"AfterBuild"任务启动,Project C(Dal Implementation)的输出被复制到Project A的Web目录(Web应用程序)

第3部分是我被困的地方.

我确信这可以做到,我只是找不到帮助的好参考.在此先感谢您的帮助.

msbuild msbuild-task

5
推荐指数
1
解决办法
1万
查看次数

如何在不执行构建的情况下检索@(TargetOutputs)

我正在实现一个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项目组而不实际执行构建?

msbuild itemgroup

5
推荐指数
1
解决办法
2300
查看次数