cabal安装抑制输出

时间:2016-06-14 10:09:13

标签: haskell io hook cabal

我创建了一个使用自定义构建类型的cabal包。在Setup.hs中,我触发了一个postCopy挂钩,我打算用它做一些IO。在触发器的主体中,我使用putStrLn输出一行。

当我cabal install包时,输出会被记录到文本文件中而不是显示在控制台上。更深入一点:我认为问题与所有触发器有关,不仅仅是postCopycabal install。因为,例如,如果我有一个postConf触发器(执行一些IO)并运行cabal configure,那么IO将按预期工作。但是,当我cabal install时,postConf触发器也会出现同样的问题。

有没有办法在stdout中显示触发器的输出?

>cabal --version
cabal-install version 1.22.6.0
using version 1.22.5.0 of the Cabal library

2 个答案:

答案 0 :(得分:1)

据我所知,在安装期间cabal运行Setup.hs,并将stdout和stderr重定向到文件。这有两个原因:

  1. 将安装输出保存在〜/ .cabal / logs / ...目录
  2. 因此它可以运行并行安装,并发作业的输出不会相互混淆
  3. 您可以使用--build-log选项告诉cabal将记录信息写入的位置,例如:

    cabal install --build-log /tmp/foo
    

    此外,如果您正在运行类似Unix / Linux的系统,您可以写入/dev/tty之类的设备并将输出返回给用户的终端(如果有的话)。例如:

    import Distribution.Simple
    import System.IO
    
    main = do
      putStrLn "=== I am here in Setup.hs"
      withFile "/dev/tty" AppendMode $ \h -> do
        hPutStrLn h "--- writing to /dev/tty"
      defaultMain
    

    当然,这是特定于操作系统的代码,如果他们没有使用与您相同的操作系统,则可能会给其他用户带来问题。

答案 1 :(得分:1)

如果您明确要求单线程构建,cabal会将其输出发送到stdout。使用

cabal install -j1

发出此请求。