某些用户的 cabal 安装不显示进度消息

Progress messages not appearing with cabal install for some users

我正在使用 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

他们的配置有何不同,他们看不到所有 "Progress" 以 [X of N] My.Module 开头的消息?

我真的希望他们能够看到编译的进度,因为我们的项目非常大,目前有 65 个模块,而且还在不断增加。干杯!

当你运行cabal install多线程(-j2及以上)时,单文件编译不会出现在stdout上,但仍应写入日志文件.

好吧,我决定只看源代码并回答我自己的问题。在深入了解 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 which wraps it with a method called compilationProgressMessage:

的函数中使用
compilationProgressMsg :: DynFlags -> String -> IO ()
compilationProgressMsg dflags msg
  = ifVerbose dflags 1 $
    logOutput dflags defaultUserStyle (text msg)

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

所以我刚刚尝试在我的终端中执行此操作:

cabal install -j4 -v1

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

无论如何,我希望这项调查也能帮助其他人。干杯,谢谢大家的指点!