CLOC忽略/排除列表文件(.clocignore)

时间:2014-10-01 22:58:03

标签: shell cloc

编辑:请参阅底部的正确用途部分。

主要问题

如何让cloc使用其--exclude-list-file=<file>选项?基本上,我正在尝试将其提供给.clocignore文件。

预期行为

cloc文档说明如下:

--exclude-list-file=<file>  Ignore files and/or directories whose names
                          appear in <file>.  <file> should have one entry
                          per line.  Relative path names will be resolved
                          starting from the directory where cloc is
                          invoked.  See also --list-file.

尝试

以下命令按预期工作:

cloc --exclude-dir=node_modules .

但是这个命令不排除任何东西:

cloc --exclude-list-file=myignorefile .

这是myignorefile

的内容
node_modules
node_modules/
node_modules/*
node_modules/**
./node_modules
./node_modules/
./node_modules/*
./node_modules/**
/full/path/to/current/directory/node_modules
/full/path/to/current/directory/node_modules/
/full/path/to/current/directory/node_modules/*
/full/path/to/current/directory/node_modules/**
如果cloc不存在,

myignorefile错误,因此我对其正在做的事情没有任何反馈。

(我正在运行OS X并通过Homebrew安装cloc v1.60。)



正确用法

tl; dr - 在@ Raman的答案中指定的方法都需要在.clocignore中指定更少,并且运行速度要快得多。


在@ Raman的回答的推动下,我调查了源代码:cloc 确实实际上尊重--exclude-list-file,但在两个重要方面处理它与--exclude-dir的处理方式不同方式。

确切的文件名与“路径的一部分”

首先,虽然--exclude-dir将忽略其路径包含指定字符串的所有文件,但--exclude-list-file将仅排除.clocignore中指定的确切文件或目录。

如果您有目录结构,请执行以下操作:

.clocignore
node_modules/foo/first.js
app/node_modules/bar/second.js

.clocignore的内容只是

node_modules

然后cloc --exclude-list-file=.clocignore .会成功忽略first.js,但会计算second.js。而cloc --exclude-dir=node_modules .将忽略两者。

要处理此问题,.clocignore需要包含此内容:

node_modules
app/node_modules

性能

其次,cloc的源代码似乎将--exlude-dir中指定的目录添加到计算文件之前参考的列表中。在计算文件后,--exclude-list-file发现的目录列表会被查询。

意思是,在--exclude-list-file忽略最终报告中的结果之前,cloc仍会处理文件,这些文件可能很慢。实验证明了这一点:在示例代码库中,使用--exclude-dir运行--exclude-list-file需要半秒钟,使用等效{{1}}运行需要11秒。

3 个答案:

答案 0 :(得分:17)

我找到的最佳解决方法是将.clocignore的内容直接提供给--exclude-dir。例如,如果您使用bash并且tr可用:

cloc --exclude-dir=$(tr '\n' ',' < .clocignore) .

答案 1 :(得分:3)

接受的答案对我不起作用,因为我也想指定子目录,这只能通过使用--not-match-d="" regex参数来实现。因此,我创建了一个PHP文件,该文件使用.clocignore文件生成了整个CLOC命令(示例输出)

$ php cloc.php

cloc --fullpath --not-match-d="(node_modules|App/ios|App/android)" --not-match-f="(yarn\.lock|package\.json|package\-lock\.json)" .

该脚本基本上将目录路径内嵌为单个正则表达式字符串,并输出完整的cloc命令以方便复制。如果有人觉得有用,我就把它放在要点上:)

https://gist.github.com/Lukakva/a2ef7626724a809ff2859e7203accf53

答案 2 :(得分:1)

--not-match-d--not-match-f也可能满足您的需求。

   --not-match-d=REGEX
       Count all files except in directories matching the Perl regex.  Only the trailing directory name is compared, for example, when counting in
       "/usr/local/lib", only "lib" is compared to the regex.  Add --fullpath to compare parent directories to the regex.  Do not include file path
       separators at the beginning or end of the regex.

  --match-f=REGEX
       Only count files whose basenames match the Perl regex. For example this only counts files at start with Widget or widget:

           --match-f='^[Ww]idget'

       Add --fullpath to include parent directories in the regex instead of just the basename.

  --not-match-f=REGEX
       Count all files except those whose basenames match the Perl regex.  Add --fullpath to include parent directories in the regex instead of just the
       basename.