36

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

主要问题

你如何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 并cloc通过 Homebrew 安装 v1.60。)



正确使用

tl;dr ——@Raman 的答案中指定的方法既不需要指定,.clocignore也运行得更快。


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

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

首先,while--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是,在忽略最终报告中的结果之前,仍然会处理可能很慢的文件。实验证明了这一点:在示例代码库中,使用 运行需要半秒,使用等效运行需要 11cloc秒。--exclude-dir--exclude-list-file

4

3 回答 3

30

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

cloc --exclude-dir=$(tr '\n' ',' < .clocignore) .
于 2014-10-31T16:13:31.137 回答
10

接受的答案对我不起作用,因为我也想指定子目录,这只能通过使用--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/a2ef7626724a809ff2859e72​​03accf53

于 2020-05-22T22:29:17.343 回答
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.
于 2020-04-20T06:33:42.947 回答