【问题标题】:cabal install suppresses outputcabal install 抑制输出
【发布时间】:2016-06-14 10:09:12
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么要这样做?也许还有另一种方法可以解决您的顾虑。

标签: haskell io hook cabal


【解决方案1】:

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

  1. 将安装输出保存在 ~/.cabal/logs/... 目录中
  2. 因此它可以运行并行安装,并且并发作业的输出不会相互混淆

您可以使用 --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

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

【讨论】:

    【解决方案2】:

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

    cabal install -j1
    

    提出这个请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-15
      • 2014-08-21
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      相关资源
      最近更新 更多