空行而不是MSBuild中的任务控制台输出

我的产品正在从Delphi 6迁移到新的Delphi XE3。 Delphi 6编译器用于输出已编译为可执行文件的文件列表:

Borland Delphi Version 14.0
Copyright (c) 1983,2002 Borland Software Corporation

ProjectName.dpr(X) 
...
PathToSomeUnit.pas(X) 
...
PathToSomeIncludedFile.inc(X)     
...
X lines, X.XX seconds, X bytes code, X bytes data.

其中“X”表示一些数字

我们有一个内部软件用于分析应用程序和特定文件(单元和包含文件)之间的依赖关系。 该软件使用dcc32控制台输出(如上所述)作为输入。

使用新的Delphi XE3,我们不再直接调用dcc32,而是使用MSBuild。 不幸的是,控制台输出与Delphi 6不一样。当“Quiet compile”选项被禁用时,控制台输出有多条空行代替编译文件列表。

Embarcadero Delphi for Win32 compiler version 24.0
Copyright (c) 1983,2012 Embarcadero Technologies, Inc.

[multiple blank lines]

X lines, X.X seconds, X bytes code, X bytes data. (TaskId:65) 

使用/ verbosity:诊断参数,它看起来如下所示

Embarcadero Delphi for Win32 compiler version 24.0 (TaskId:65)
Copyright (c) 1983,2012 Embarcadero Technologies, Inc. (TaskId:65)
(TaskId:65)
(TaskId:65)
(TaskId:65)
(TaskId:65)
(TaskId:65)
(TaskId:65)
...
X lines, X.X seconds, X bytes code, X bytes data. (TaskId:65)

直接调用dcc32时,出现了类似的问题,但是使用“-B”编译器开关(-B = Build all units)解决了这个问题。 我通过添加/ p:DCC_AdditionalSwitches = -B来尝试类似MSBuild的方法,但仍输出多个空行。


这是一个可能的解决方案:

  • 备份您的文件等
  • 打开一个.NET Framework SDK v2.0命令提示符。
  • 反汇编Borland.Build.Tasks.Delphi.dll (位于$(BDS)bin目录中):

    ildasm Borland.Build.Tasks.Delphi.dll /out=Borland.Build.Tasks.Delphi.il

  • 编辑Borland.Build.Tasks.Delphi.dcctask.xml (由上一步创建)并注释掉OutputParsing节点的Ignore子节点。

  • 重新组装它:

    ilasm Borland.Build.Tasks.Delphi.il /dll

  • 注册一个强名称例外:

    sn -Vr Borland.Build.Tasks.Delphi.dll

  • 如果您按照本答案所述关闭了安静模式,那么使用MSBuild构建您的Delphi项目现在应该显示详细的编译器输出。


    添加-取决于DCC32命令行或/ p:DCC_OutputDependencies =对于msbuild,它会输出一个可以轻松解析的.d文件,如下例所示:

    C:publicoBUILDtempYourDPR.exe: YourDPR.dpr 
            C:blabla blablaFrameWorkBasebibliotecadcusunit15.dcu 
            C:blabla blablaFrameWorkBasebibliotecadcusunit13.dcu 
            C:bla blablaLIBD5Unitsunit12.dcu 
            C:blabla blablaFrameWorkBasebibliotecarxlibunitsunit1.dcu 
            C:blabla blablaFrameWorkBasebibliotecarxlibunitsunit13.dcu 
            C:bla blablaLIBD5Unitsunit1.dcu 
            C:bla blablaLIBD5Unitsunit12.dcu 
    

    PS。 你可以用/ p隐藏这些空白的msbuild行:DCC_Hints = false;

    链接地址: http://www.djcxy.com/p/67677.html

    上一篇: Blank lines instead of a task console output in MSBuild

    下一篇: How to define version "and up" ifdefs in Delphi?