Wie finde ich heraus, wie viele Codezeilen ein Xcode-Projekt enthält?

148

Gibt es eine Möglichkeit zu bestimmen, wie viele Codezeilen ein Xcode-Projekt enthält? Ich verspreche, solche Informationen nicht für Managementmessungen oder Mitarbeiter-Benchmarking-Zwecke zu verwenden. ;)

Dave Gallagher
quelle
Wenn Sie Zeilen möchten, können Sie diese Antwort verwenden: stackoverflow.com/questions/5901758/… Aber es enthält Leerzeichen
GeneCode

Antworten:

126

Schauen Sie sich CLOC an .

cloc zählt in vielen Programmiersprachen Leerzeilen, Kommentarzeilen und physische Zeilen des Quellcodes.

( Legacy-Builds werden auf SourceForge archiviert .)

Nathan Kinsinger
quelle
11
CLOC ist über Homebrew erhältlich. Die Benutzerfreundlichkeit in der Befehlszeile war erfrischend.
Avelis
1
Ich liebe das Wortspiel im Namen dort - ja, Sie können anhand Ihres CLOC feststellen, wie produktiv Sie waren.
Bobobobo
Verwenden Sie den obigen Link, um die Perm-Version des Cloc-Tools './cloc-1.56.pl' herunterzuladen. Stellen Sie sicher, dass Sie die Ausführungsberechtigung für die Datei cloc-1.56.pl mit dem Befehl 'chmod u + x cloc-1.56.pl' aktivieren. Wenn sich Ihr Quellcode im Verzeichnis 'project_code' befindet, müssen Sie nur den folgenden Befehl ausführen.
JZ.
233

Ich sehe das herumschweben und benutze es selbst:

find . "(" -name "*.m" -or -name "*.mm" -or -name "*.cpp" -or -name "*.swift" ")" -print0 | xargs -0 wc -l
Joshua Nozzi
quelle
2
So behandeln Sie Unterverzeichnisse mit Leerzeichen in den Namen, die Sie benötigen: find. "(" -name " .m" -oder -name " .mm" -oder -name "* .cpp" ")" -print0 | xargs -0 wc -l
Matt__C
2
Dieser Blog-Beitrag kann helfen: allara.blogspot.co.uk/2010/12/…
Eric Brotto
12
Wir veröffentlichen Antworten auf SO und keine Links zu Blogeinträgen, die fast die gleiche Antwort liefern.
Joshua Nozzi
6
Es scheint, dass den .m- und .mm-Tests ein * fehlt (bearbeitet: scheint, dass SO diese ohne vorhergehenden Schrägstrich nicht rendert). Das Obige hat bei mir nicht funktioniert, bis ich sie als solche hinzugefügt habe: find. "(" -name "* .m" -oder -name "* .mm" -oder -name "* .cpp" ")" -print0 | xargs -0 wc -l
bladnman
2
Hinweis für Swift-Benutzer - ersetzen oder fügen Sie ein anderes 'oder' durch die Dateierweiterung .swift
Byron Coetsee
79

Ich habe CLOC verwendet, wie von erwähntNathan Kinsinger und es ist ziemlich einfach zu bedienen. Es ist ein PERL-Skript, das Sie hinzufügen und aus Ihrem Projektverzeichnis ausführen können.

PERL ist bereits Teil von Mac OS und Sie können das Skript auf diese Weise aufrufen, um herauszufinden, wie viele Zeilen Sie geschrieben haben:

perl cloc-1.56.pl ./YourDirectoryWhereYourSourcesAre

Dies ist ein Beispiel für die Ausgabe, die ich von einem solchen Befehl erhalten habe:

   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
quelle
4
Nett! Das gefällt mir besser als meine eigene Antwort. :-)
Joshua Nozzi
1
Möglicherweise müssen Sie zuerst das Skript herunterladen. Navigieren Sie dann zu dem Verzeichnis, in dem sich das Skript befindet, und führen Sie diesen Befehl mit dem von Ihnen heruntergeladenen Dateinamen aus.
Prolfe
Sollte cloc perl-1.56.pl ./YourDirectoryWhereYourSourcesAre sein und nicht wie oben, wenn Sie perl von Grund auf neu installieren, stellen Sie sicher, dass Sie die aktuelle Perl-Version eingeben (meine war 5.30.1, also im Grunde cloc perl-5.30.1.pl ./)
Golan Shay
1
Eine letzte Sache, ich musste span Moo gemäß dem Fehler ausführen, der beim ersten Ausführen auftrat, also checke auch für diesen aus
Golan Shay
50

Öffnen Sie Terminal.app, wechseln Sie in das Stammverzeichnis Ihres Projekts und führen Sie den folgenden Befehl aus:

Nur für Swift:

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

Nur für Obj-C:

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

Für Obj-C + Swift:

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

Für 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 '{}' \+

Terminal schnelle Tipps:
ls: list Verzeichnisinhalt
cd: Verzeichnis wechseln
Drücken Registerkarte automatisch zu vervollständigen
Denken Sie daran zu setzen „\“ Backslash vor Leerzeichen
Ich schlage vor einem Ordner nach unten aus dem Hauptprojekt , so dass Sie Codezahl aus dem Frameworks loswerden

Esqarrouth
quelle
44

Wechseln Sie im Terminal in das Projektverzeichnis und führen Sie Folgendes aus:

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

Wenn Sie nur bestimmte Dateitypen möchten, versuchen Sie etwas wie

find . -type f -name \*.[ch]* -print0 | xargs -0 cat | wc -l
Andrew McGregor
quelle
Schön, enthält aber Kommentare und Leerzeilen und ist daher nicht genau das, wonach gefragt wurde. Eine LOC-Kennzahl sollte so unabhängig wie möglich vom Code-Formatierungsstil sein. Daher sollten eine Reihe von Leerzeilen oder Kommentaren zwischen logischen Teilen in einer Datei nicht für die Summe angerechnet werden.
Bassim
34

Schauen Sie sich Xcode Statistician an, es macht genau das, was Sie wollen. Es bietet auch andere interessante Statistiken und ist daher ab und zu einen Lauf zum Spaß wert.

Beachten Sie, dass es nicht in echten Ordnern angezeigt wird, obwohl es in Gruppen angezeigt wird. Wahrscheinlich verwenden Sie keine echten Ordner, daher funktioniert es hervorragend. Wenn Sie Ordner verwenden, müssen Sie nur die Zählung in jedem Ordner durchführen und diese addieren.

Hinweis: Ab Juni 2012 scheint dies mit den neuesten Versionen von Xcode nicht richtig zu funktionieren.

Matthew Frederick
quelle
Nur ein Hinweis für diejenigen, die Objective-C und C / C ++ mischen: Es werden keine * .c- oder * .cpp-Dateien gezählt.
Emile Cormier
3
Beachten Sie, dass Xcode Statisician derzeit keine Unterverzeichnisse in Ihrem Projekt behandelt.
Matt__C
@Matt__C Ja, daher "Beachten Sie, dass es nicht in echte Ordner schaut". Leider etwas mehr manuelle Arbeit (und rekursive Ordnersuche ist einfach zu codieren), aber es funktioniert.
Matthew Frederick
1
Scheint, dass es mit X-Code 4.2-Projekten auf Lion überhaupt nicht funktioniert (zumindest gab es keine Statistiken für mein Projekt)
BadPirate
Ah, Mist, es könnte jetzt veraltet sein.
Matthew Frederick
30
  1. Terminal öffnen
  2. Navigieren Sie zu Ihrem Projekt
  3. Führen Sie den folgenden Befehl in Ihrem Projekt aus:

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

    Oder:

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

(* Ohne die Anzahl der Pod-Dateien von der Gesamtzahl)

Shan Shafiq
quelle
16

Wenn Sie im Terminal in das Verzeichnis Ihres Projekts gehen und Folgendes eingeben:

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

Dadurch erhalten Sie eine Projektaufschlüsselung sowie die Zeilensumme für jede Datei und das gesamte Projekt.

RileyE
quelle
Für Swift einfach alles entfernt und .swiftfind . "(" -name "*.swift" ")" -print0 | xargs -0 wc -l
WCByrne
@ WCByrne Alternativ können wir einfach .swift zum ursprünglichen Befehl hinzufügen
RileyE
Tatsächlich. Da sich die meisten Bibliotheken und ausgeliehener Code noch in .h & .m befinden, konnte der Countdown auf das reduziert werden, was ich geschrieben hatte.
WCByrne
1
Absolut. Jeder hat seine eigene Lösung. Und wenn sie ein eigenes Präfix haben (zB: "RE"), könnten sie es sogar tunfind . "(" -name "RE*.swift" ")" -print0 | xargs -0 wc -l
RileyE
9

Nozzis Version funktioniert bei mir nicht, aber diese:

find . -type f -print0 | xargs -0 cat | wc -l
Pascalius
quelle
1
kurz und prägnant - aber es zählt Zeilen auch für Nicht-Quellcode-Dateien. Daher ist hier die Filterung der Dateinamenerweiterung von entscheidender Bedeutung. Das OP wollte "Quellcodezeilen" zählen. keine Textzeilen.
Motti Shneor
7

Ein schneller und einfacher Weg:

Verwenden Sie eine Regex-Suche (Find Navigator, wählen Sie Find> Regular Expression).

. \ n

Funktioniert bequem mit Xcode-Suchbereichen und kann problemlos an jeden Linientyp angepasst werden, den Sie zählen möchten;).

Patrick Pijnappel
quelle
Das ist schön! Nicht die schnellste, aber ohne die Entwicklungsumgebung zu verlassen. Ich mag das. Wahrscheinlich kann ein besserer regulärer Ausdruck das Zählen von Leerzeichen und ähnlichen Dingen vermeiden.
Motti Shneor
Halte es einfach. Ich mag das.
devios1
6

Sie können SLOCCount über MacPorts installieren . Oder, gröber, Sie können wc -l verwenden.

Anthony
quelle
CLOC basiert auf SCLOCount, daher denke ich, dass es immer noch ein besserer Ansatz ist, CLOC
tiguero
4
"Geschätzte Gesamtentwicklungskosten = 1.934.715 USD". Das machte meinen Tag!
Valeriy Van
4

Ich bin mit xcode nicht vertraut, aber wenn Sie nur die Anzahl der Zeilen aus all diesen spezifischen Dateien in einem Verzeichnisbaum zählen müssen, können Sie den folgenden Befehl verwenden:

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

Nach der Antwort von Joshua Nozzi würde in GNU der reguläre Ausdruck für solche Dateien wie folgt lauten:

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

oder auch

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

Dies verwendet einen regulären Ausdruck, um alle Dateien abzugleichen, die entweder .mmit .mm, .cppoder enden .swift. Weitere Informationen zu diesen Ausdrücken finden Sie unter Verwendung von Regex in der Dateisuche .

Wenn Sie mit Mac OS find arbeiten , benötigen Sie einen etwas anderen Ansatz, wie von Motti Shneor in den Kommentaren erläutert :

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

Beide liefern eine Ausgabe in Form von:

234 ./file1
456 ./file2
690 total

Sie können es also entweder so lassen oder einfach zu tail -1(das heißt find ... | tail -1) weiterleiten, sodass Sie nur die letzte Zeile als Summe erhalten.

fedorqui 'SO hör auf zu schaden'
quelle
Nun, der Fund -regex ". * \. etc funktioniert unter MacOS nicht für mich - er behauptet eine illegale Option - oder welche Art von Fund verwenden Sie?
Motti Shneor
@MottiShneor Sie möchten wahrscheinlich diese Frage überprüfen , wo sie \|und andere in MacOS sprechen . --regexist sowohl in GNU find (dem von mir verwendeten) als auch in MacOS gültig.
Fedorqui 'SO hör auf zu schaden'
gut --- nein. Ich habe in MacOS herausgefunden, dass Sie -E für erweiterte reguläre Ausdrücke finden müssen. Kopieren Sie den oben vorgeschlagenen Befehl auf das OS-X, das Sie erhalten können, und überzeugen Sie sich selbst. Mann finden auf MacOS-X sagt Ihnen, dass Sie -E dafür müssen.
Motti Shneor
Schließlich müssen Sie auch einen Pfad angeben, in dem unter OSX gesucht werden kann. Die Variation, die funktioniert, sieht also folgendermaßen aus: find -E. -regex ". * \. ([hmc] | mm | cp + | swift | pch) $" -exec wc -l {} +
Motti Shneor
@MottiShneor bedankt sich für die Bereitstellung des Ansatzes in MacOS. Ich habe die Antwort damit aktualisiert.
fedorqui 'SO hör auf,'
2

Entschuldigung für die Wiederholung. Das ist meiner Meinung nach der einfachste Weg:

  1. Im Terminaltyp

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

Dadurch werden alle Dateien aus dem Projektordner in kopiert newFolder.

  1. Laden Sie Xcode Statistician herunter und verwenden Sie es mitnewFolder Geben Sie hier die Bildbeschreibung ein
Nik Kov
quelle
Dieses Tool findet nicht alles, es sieht eher so aus, als ob es tatsächlich nur im aktuellen Ordner (nicht einmal in Unterordnern) aussieht
Daniel
Ich schrieb, dass der erste Schritt darin besteht, alle Dateien aus dem Projektordner in einen Ordner zu kopieren.
Nik Kov
Ist das zufällig "XcodeStatistican" Open Source? Ich würde es in kürzester Zeit auf jede Projektstruktur bringen ... Verzeichnis- und Datei-Iteratoren sind nicht so schwer zu machen. Auch - der Download von hier - ist nicht von einem identifizierten Entwickler signiert - könnte also Malware sein: /
Motti Shneor
1

line-counterist eine gute Alternative. Es ist leichter als CLOC und viel leistungsfähiger und einfacher zu bedienen als andere Befehle.

Ein kurzer Überblick

So erhalten Sie das Tool

$ pip install line-counter

Verwenden Sie den lineBefehl, um die Anzahl der Dateien und Zeilen im aktuellen Verzeichnis abzurufen (rekursiv).

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

Wenn Sie mehr Details wünschen, verwenden Sie einfach 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

Und das Beste an diesem Tool ist, dass Sie .gitignore wie configure file hinzufügen können. Sie können Regeln einrichten, um auszuwählen oder zu ignorieren, welche Art von Dateien gezählt werden sollen, genau wie in '.gitignore'. Ja, dieses Tool wurde nur erfunden, um zu wissen, wie viele Zeilen ich habe.

Weitere Beschreibung und Verwendung finden Sie hier: https://github.com/MorganZhang100/line-counter

Ich bin der Autor dieses einfachen Tools. Hoffe es kann jemandem helfen.

Morgan Zhang
quelle