Как узнать, сколько строк кода в проекте Xcode?

149

Есть ли способ определить, сколько строк кода содержит проект XCode? Я обещаю не использовать такую ​​информацию для управленческих измерений или целей сравнительного анализа сотрудников. ;)

Дейв
источник
Если вы хотите строки, то вы можете использовать этот ответ: stackoverflow.com/questions/5901758/… Но он включает пробелы
GeneCode

Ответы:

126

Проверьте CLOC .

cloc считает пустые строки, строки комментариев и физические строки исходного кода во многих языках программирования.

( Устаревшие сборки архивируются на SourceForge .)

Натан Кинсингер
источник
11
CLOC доступен через Homebrew. Простота использования в командной строке была освежающей.
Авелис
1
Мне нравится каламбур в названии - да, вы можете сказать, насколько продуктивно вы были, проверив свой CLOC.
Бобобобо
Используйте приведенную выше ссылку, чтобы загрузить «./cloc-1.56.pl» пермскую версию инструмента cloc. Убедитесь, что вы включили разрешение на выполнение файла cloc-1.56.pl с помощью команды 'chmod u + x cloc-1.56.pl'. Если ваш исходный код находится в каталоге 'project_code', вам просто нужно выполнить следующую команду.
JZ.
233

Я вижу это плавающим вокруг и использую это сам:

find . "(" -name "*.m" -or -name "*.mm" -or -name "*.cpp" -or -name "*.swift" ")" -print0 | xargs -0 wc -l
Джошуа Ноцци
источник
2
Для обработки подкаталогов с пробелами в именах вам нужно: найти. "(" -name " .m" -or -name " .mm" -or -name "* .cpp" ")" -print0 | xargs -0 wc -l
Matt__C
2
Это сообщение в блоге может помочь: allara.blogspot.co.uk/2010/12/…
Эрик Бротто
12
Мы публикуем ответы на SO, а не ссылки на записи в блогах, которые дают практически одинаковые ответы.
Джошуа Ноцци
6
кажется, что в тестах .m и .mm отсутствует * (отредактировано: кажется, что SO не выполняет рендеринг без предшествующего слэша) "(" -name "* .m" -or -name "* .mm" -or -name "* .cpp" ")" -print0 | xargs -0 wc -l
bladnman
2
Примечание для пользователей Swift - замените или добавьте еще один 'или' с расширением файла .swift
Байрон Коэтзее
79

Я использовал CLOC, как уже упоминалось,Nathan Kinsinger и он довольно прост в использовании. Это скрипт PERL, который вы можете добавить и запустить из каталога вашего проекта.

PERL уже является частью Mac OS, и вы можете запустить скрипт таким образом, чтобы узнать количество написанных вами строк:

perl cloc-1.56.pl ./YourDirectoryWhereYourSourcesAre

Это пример вывода, который я получил от такой команды:

   176 text files.
   176 unique files.                                          
     4 files ignored.

http://cloc.sourceforge.net v 1.56  T=2.0 s (86.0 files/s, 10838.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Objective C                     80           3848           1876          11844
C/C++ Header                    92            980           1716           1412
-------------------------------------------------------------------------------
SUM:                           172           4828           3592          13256
-------------------------------------------------------------------------------
tiguero
источник
4
Ницца! Мне нравится это лучше, чем мой собственный ответ. :-)
Джошуа Ноцци
1
Возможно, вам придется сначала скачать скрипт. Затем перейдите в каталог, где находится этот скрипт, и запустите эту команду с тем именем файла, которое вы скачали.
prolfe
Должно быть закрыто perl-1.56.pl ./YourDirectoryWhereYourSourcesAre, а не так, как указано выше. Если вы устанавливаете perl с нуля, убедитесь, что вы вводите текущую версию perl (у меня была 5.30.1, поэтому в основном cloc perl-5.30.1.pl ./)
Голанский Шей
1
И последнее, я должен был запустить span Moo в соответствии с ошибкой, которая возникла при его запуске в первый раз, так что проверьте и эту
Golan Shay
50

Откройте Terminal.app, перейдите в корневой каталог вашего проекта и выполните эту команду:

Только для Swift:

find . \( -iname \*.swift \) -exec wc -l '{}' \+

Только для Obj-C:

find . \( -iname \*.m -o -iname \*.mm -o -iname \*.h \) -exec wc -l '{}' \+

Для Obj-C + Swift:

find . \( -iname \*.m -o -iname \*.mm -o -iname \*.h -o -iname \*.swift \) -exec wc -l '{}' \+

Для Obj-C + Swift + C + C ++:

find . \( -iname \*.m -o -iname \*.mm -o -iname \*.c -o -iname \*.cc -o -iname \*.h -o -iname \*.hh -o -iname \*.hpp -o -iname \*.cpp -o -iname \*.swift \) -exec wc -l '{}' \+

Советы по работе с терминалом:
ls: список содержимого каталога
cd: изменение каталога
Нажмите для автозаполнения вкладки Не
забудьте поставить обратную косую черту "\" перед пробелами.
Я предлагаю убрать одну папку из основного проекта, чтобы вы избавились от счетчика кода из каркасов

Esqarrouth
источник
44

В терминале перейдите в каталог проекта и запустите:

find . -type f -print0 | xargs -0 cat | wc -l

Если вы хотите только определенные типы файлов, попробуйте что-то вроде

find . -type f -name \*.[ch]* -print0 | xargs -0 cat | wc -l
Эндрю МакГрегор
источник
Хорошо, но включает в себя комментарии и пустые строки и, следовательно, не совсем то, что просили. Мера LOC должна быть настолько независимой от стиля форматирования кода, насколько это возможно, и, таким образом, группа пустых строк или комментариев между логическими частями в файле не должна учитываться в сумме.
Бассим
34

Проверьте Xcode Statistician, он делает именно то, что вы хотите. Он также предоставляет другую интересную статистику, так что стоит попробовать время от времени.

Обратите внимание, что он не будет смотреться внутри реальных папок, хотя будет выглядеть в группах. Скорее всего, вы не используете настоящие папки, поэтому он будет отлично работать. Если вы используете папки, то вам просто нужно сделать подсчет в каждой папке и сложить их вместе.

Примечание. По состоянию на июнь 2012 года, похоже, это не работает должным образом с последними версиями Xcode.

Мэтью Фредерик
источник
Просто замечательно для тех, кто смешивает Objective-C и C / C ++: он не учитывает файлы * .c или * .cpp.
Эмиль Кормиер
3
Обратите внимание, что на данный момент Xcode Statisician не имеет дело с подкаталогами в вашем проекте.
Matt__C
@Matt__C Да, отсюда "Обратите внимание, что он не будет смотреться внутри реальных папок". К сожалению, немного больше ручной работы (и рекурсивный поиск по папкам легко кодировать), но это выполнимо.
Мэтью Фредерик
1
Кажется, что он не работает вообще с проектами X-Code 4.2 на Lion (по крайней мере, он не дал никакой статистики для моего проекта)
BadPirate
Ах, облом, это может устареть сейчас.
Мэтью Фредерик
31
  1. открытый терминал
  2. перейти к вашему проекту
  3. выполните следующую команду внутри вашего проекта:

    find . -path ./Pods -prune -o -name "*.swift" -print0 ! -name "/Pods" | xargs -0 wc -l

    Или:

    find . -path ./Pods -prune -o -name "*[hm]" -print0 ! -name "/Pods" | xargs -0 wc -l

(* Исключая количество файлов pod из общего количества)

Шань Шафик
источник
16

Если вы перейдете в каталог вашего проекта в терминале и введите:

find . "(" -name "*.h" -or -name "*.m" -or -name "*.mm" -or -name "*.hpp" -or -name "*.cpp"  -or  -name "*.c" -or -name "*.cc" -or -name "*.swift" ")" -print0 | xargs -0 wc -l

Это даст вам разбивку по проекту, а также общее количество строк для каждого файла и проекта в целом.

RileyE
источник
Для быстрого просто удалил все и добавил .swiftfind . "(" -name "*.swift" ")" -print0 | xargs -0 wc -l
WCByrne
@WCByrne В качестве альтернативы, мы можем просто добавить .swift к исходной команде
RileyE
На самом деле. Поскольку большинство библиотек и заимствованного кода все еще находятся в .h & .m, это помогло сократить счет до того, что я написал.
WCByrne
1
Абсолютно. У каждого свое решение. И если у них есть собственный префикс (например, «RE»), они могут даже сделатьfind . "(" -name "RE*.swift" ")" -print0 | xargs -0 wc -l
RileyE
9

Версия Ноззи не работает для меня, но эта:

find . -type f -print0 | xargs -0 cat | wc -l
Pascalius
источник
1
краткий и краткий - но он также учитывает строки в файлах, не являющихся исходным кодом. Так что на самом деле фильтрация по имени файла имеет решающее значение здесь. ОП хотел посчитать «строки исходного кода». не какие-либо текстовые строки.
Мотти Шнеор
7

Быстрый и простой способ:

Используйте поиск по регулярному выражению (Найти навигатор, выберите «Найти»> «Регулярное выражение»).

. \ П

Удобно работает с областями поиска XCode, и вы можете легко настроить его для любого типа линии, которую вы хотите считать;).

Патрик Пийнаппель
источник
Теперь это хорошо! не самый быстрый, но не выходя из среды разработки. Мне это нравится. Вероятно, лучшее регулярное выражение может избежать подсчета пустых строк и тому подобного.
Мотти Шнеор
Будь проще. Мне это нравится.
devios1
6

Вы можете установить SLOCCount через MacPorts. Или, грубо говоря, вы можете использовать wc -l.

Энтони
источник
CLOC основан на SCLOCount, поэтому я думаю, что использовать CLOC все же лучше
tiguero
4
«Общая сметная стоимость разработки = 1 934 715 долларов США». Это сделало мой день!
Валерий Ван
4

Я не знаком с xcode, но если все, что вам нужно, это подсчитать количество строк во всех этих конкретных файлах в дереве каталогов, вы можете использовать следующую команду:

find .... match of all those files ... -exec wc -l {} +

Следуя ответу Джошуа Ноззи , в GNU регулярное выражение для таких файлов будет выглядеть так:

find . "(" -name "*.m" -or -name "*.mm" -or -name "*.cpp" -or -name "*.swift" ")" -exec wc -l {} +

или даже

find -regex ".*\.\(m\|mm\|cpp\|swift\)$" -exec wc -l {} +

это использует регулярное выражение , чтобы соответствовать всем файлам , заканчивающимся в любом .m, .mm, .cppили .swift. Вы можете увидеть больше информации об этих выражениях в разделе Как использовать регулярные выражения в файле find .

Если вы работаете с Mac OS find , то вам нужен немного другой подход, как объяснил Мотти Шнеор в комментариях:

find -E . -regex ".*\.([hmc]|mm|cp+|swift|pch)$" -exec wc -l {} +

Оба предоставят вывод в виде:

234 ./file1
456 ./file2
690 total

Таким образом, вы можете оставить это так или просто передать tail -1(то есть find ... | tail -1), чтобы получить только последнюю строку, являющуюся итогом.

Федорки "ТАК прекратить вредить"
источник
хорошо - find -regex ". * \. и т. д. у меня не работает на MacOS - он заявляет о недопустимом выборе --r какой тип поиска вы используете?
Мотти Шнеор
@MottiShneor Вы, вероятно, хотите проверить этот вопрос, где они обсуждают \|и другие в MacOS. --regexдействует как в GNU find (тот, который я использую), так и в MacOS.
Федорки "ТАК прекрати вредить"
Ну нет. Я обнаружил, что в MacOS вы должны найти -E для расширенных регулярных выражений. Скопируйте предложенную выше команду на любую OS-X, которую вы можете получить, и убедитесь сами. man find на MacOS-X говорит вам, что вы должны -E для этого.
Мотти Шнеор
Наконец, вы также должны указать путь для поиска в OSX. так что вариант, который работает, выглядит так: найти -E. -regex ". * \. ([hmc] | mm | cp + | swift | pch) $" -exec wc -l {} +
Мотти Шнеор
@MottiShneor спасибо за предоставленный подход в MacOS. Я обновил ответ с этим.
Федорки «ТАК прекрати вредить»
2

Извините за повторение. Это самый простой способ ИМХО:

  1. В терминальном типе

find /users/<#username#>/documents/folderWithProject/ -type f -exec cp {} /users/<#username#>/documents/folderWithProject/newFolder/ \;

Это скопирует все файлы из папки проекта в newFolder.

  1. Скачайте Xcode Statistician и используйте его вместе сnewFolder введите описание изображения здесь
Ник Ков
источник
Этот инструмент не находит все, он больше похож на то, что на самом деле выглядит только в текущей папке (даже не во вложенных папках)
Daniel
Я написал, что первым шагом является копирование всех файлов из папки проекта в одну папку.
Ник Ков
Это открытый код XcodeStatistican случайно? Я бы сделал так, чтобы это работало с любой структурой проекта в кратчайшие сроки ... Итераторы каталогов и файлов не так сложны. Кроме того - загрузка отсюда - не подписана идентифицированным разработчиком, поэтому может быть и вредоносное ПО: /
Motti Shneor
1

line-counterхорошая альтернатива Он легче, чем CLOC, и намного мощнее и проще в использовании, чем другие команды.

Краткий обзор

Вот как вы получаете инструмент

$ pip install line-counter

Используйте lineкоманду, чтобы получить количество файлов и количество строк в текущем каталоге (рекурсивно)

$ line
Search in /Users/Morgan/Documents/Example/
file count: 4
line count: 839

Если вы хотите больше деталей, просто используйте line -d.

$ line -d
Search in /Users/Morgan/Documents/Example/
Dir A/file C.c                                             72
Dir A/file D.py                                           268
file A.py                                                 467
file B.c                                                   32
file count: 4
line count: 839

И лучшая часть этого инструмента, вы можете добавить .gitignore как файл конфигурации к нему. Вы можете установить правила, чтобы выбирать или игнорировать, какие типы файлов считать так же, как в «.gitignore». Да, этот инструмент просто придуман, чтобы знать, сколько строк у меня легче.

Более подробное описание и использование здесь: https://github.com/MorganZhang100/line-counter

Я автор этого простого инструмента. Надеюсь, это может кому-нибудь помочь.

Морган Чжан
источник