通过nix-build运行时,能否保留Cabal生成的测试套件日志?

时间:2018-10-17 22:51:25

标签: haskell cabal-install nix

我有一个指定测试套件的.cabal文件,还有一个用cabal2nix生成的default.nix文件。

然后我有一个release.nix文件(包含pkgs.haskell.packages.ghc802.callPackage ./default.nix {})之类的nix-build

有效:我的程序有结果符号链接。

在使用nix-build编译程序时,我在输出中看到以下行:Test suite logged to: dist/test/myprogram-0.0.0-test-suite.log(我猜是由cabal test间接产生的),但是文件似乎被丢弃了。

是否可以保留该日志文件(可能在结果符号链接指向的目录中)?

1 个答案:

答案 0 :(得分:3)

在测试套件成功的情况下保留日志文件

您可以指定一个Shell脚本,该脚本在由postCheck运行测试套件之后执行。仅在测试套件成功的情况下执行。

在有或没有cabal2nix的情况下调用--shell都将包含类似于输出的推导:

 { mkDerivation, base, stdenv }:
      mkDerivation {
        pname = "sample";
        version = "0.0.0.1";
        src = ./.;
        isLibrary = false;
        isExecutable = true;
        executableHaskellDepends = [ base ];
        testHaskellDepends = [ base ];
        license = stdenv.lib.licenses.unfree;
        hydraPlatforms = stdenv.lib.platforms.none;
      };

您只需添加

 postCheck = ''
              mkdir -p $out/logs
              find dist/test -name \*log -exec cp '{}' $out/logs \;
            '';

,您将在result/logs中找到日志文件。

整个推导现在看起来像:

 { mkDerivation, base, stdenv }:
      mkDerivation {
        pname = "sample";
        version = "0.0.0.1";
        src = ./.;
        isLibrary = false;
        isExecutable = true;
        executableHaskellDepends = [ base ];
        testHaskellDepends = [ base ];
        license = stdenv.lib.licenses.unfree;
        hydraPlatforms = stdenv.lib.platforms.none;
        postCheck = ''
              mkdir -p $out/logs
              find dist/test -name \*log -exec cp '{}' $out/logs \;
            '';
      };

保留日志文件,以防测试套件失败

如果要在测试套件失败的情况下查看这些日志文件,则可以使用选项nix-build--keep-failed来调用-K。这样,它将保留临时构建目录并显示一条消息,如

note: keeping build directory '/tmp/nix-build-sample-0.0.0.1.drv-0'

输出接近尾声(对我来说,倒数第三行)。您将在该目录中找到日志文件。在我的 例如,它们已经放置在

/tmp/nix-build-sample-0.0.0.1.drv-0/sample/dist/test