CLOC игнорировать/исключать файл списка (.clocignore)

(Изменение: см. Раздел " Надлежащее использование " внизу).

Основной вопрос

Как вы можете использовать cloc для использования cloc --exclude-list-file=<file>? По сути, я пытаюсь .clocignore файл .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 v1.60 через Homebrew.)



Правильное использование

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 в список, который --exlude-dir перед подсчетом файлов. В то время как список каталогов, обнаруженных в --exclude-list-file рассматривается после подсчета файлов.

Значение, --exclude-list-file все еще обрабатывает файлы, которые могут быть медленными, прежде чем игнорировать их результаты в окончательном отчете. Это подтверждается экспериментами: в примерной кодовой базе потребовалось полсекунды для запуска cloc с cloc --exclude-dir и 11 секунд для запуска с эквивалентным --exclude-list-file.

Ответы

Ответ 1

Лучшее обходное решение, которое я нашел, - это .clocignore содержимое .clocignore непосредственно в --exclude-dir. Например, если вы используете bash и имеете tr доступны:

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