某些用户无法使用cabal安装进度消息

时间:2015-06-06 00:31:57

标签: haskell configuration ghc cabal cabal-install

我正在使用Haskell开展一个团队项目,每当我使用'cabal install'编译我们的项目时,我开始看到以下内容:

$ cabal clean && cabal install
cleaning...
Resolving dependencies...
Configuring hackathon-0.1...
Building hackathon-0.1...
Preprocessing executable 'hackathon' for hackathon-0.1...
[ 1 of 65] Compiling Data.MaybeUtil   ( src/Data/MaybeUtil.hs, dist/dist-sandbox-52369b17/build/hackathon/hackathon-tmp/Data/MaybeUtil.o )
[ 2 of 65] Compiling Data.JQL         ( src/Data/JQL.hs, dist/dist-sandbox-52369b17/build/hackathon/hackathon-tmp/Data/JQL.o )
[ 3 of 65] Compiling Data.Tuples      ( src/Data/Tuples.hs, dist/dist-sandbox-52369b17/build/hackathon/hackathon-tmp/Data/Tuples.o )
...
$

但是,我的团队成员看到了:

$ cabal clean && cabal install
cleaning...
Resolving dependencies...
Configuring hackathon-0.1...
Building hackathon-0.1...
Installed hackathon-0.1

他们的配置有什么不同,他们没有看到以[X of N] My.Module开头的所有“进度”消息?

我真的希望他们能够看到正在发生的编译进度,因为我们的项目非常庞大,目前有65个模块并且正在增长。干杯!

2 个答案:

答案 0 :(得分:3)

当您运行cabal install多线程(-j2及更高版本)时,单个文件编译不会出现在stdout上,但仍应写入日志文件。

答案 1 :(得分:1)

好的,我决定只看一下源代码并回答我自己的问题。在深入了解cabal-install源代码并最终进入GHC源代码后,我最终在compiler/main/HscMain.hs的底部找到了我想要的内容:

showModuleIndex :: (Int, Int) -> String
showModuleIndex (i,n) = "[" ++ padded ++ " of " ++ n_str ++ "] "
  where
    n_str = show n
    i_str = show i
    padded = replicate (length n_str - length i_str) ' ' ++ i_str

这是打印模块索引的方法。它在名为batchMsg的函数中使用,该函数使用名为compilationProgressMessage的方法对其进行包装:

compilationProgressMsg :: DynFlags -> String -> IO ()
compilationProgressMsg dflags msg
  = ifVerbose dflags 1 $
    logOutput dflags defaultUserStyle (text msg)

正如您所看到的,如果详细程度为1或更高,此方法仅将内容打印到日志输出文件流。

所以我刚尝试在我的终端上做到这一点:

cabal install -j4 -v1

然后,如果我尾随-fabal-sandbox / logs / package-name.log文件,那么我可以看到模块索引的编译消息发生了。我认为这解决了这个问题。然后,当编译完成(或错误输出)时,所有模块消息都会打印到stdout。在GHC中并行编译似乎阻止了对stdout的打印调用。当你打开并行编译时,还有一些东西可以将详细程度设置为0。我认为这两个都是错误,应该修复,所以我现在可以尝试提出功能请求。

无论如何,我希望这项调查能够帮助其他人。欢呼并感谢所有人的指示!