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



我有一个 .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间接生成的(,但该文件似乎被丢弃了。

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

保留日志文件以防测试套件成功

您可以指定一个 shell 脚本,该脚本在测试套件由postCheck运行后执行。仅当测试套件成功时,才会执行此操作。

调用带或不带--shellcabal2nix将包含类似于输出的派生:

{ 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 ;
'';
};

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

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

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

最新更新