Comment savoir combien de lignes de code il y a dans un projet Xcode?


149

Existe-t-il un moyen de déterminer combien de lignes de code un projet Xcode contient? Je m'engage à ne pas utiliser ces informations à des fins de mesure de gestion ou d'analyse comparative des employés. ;)


Si vous voulez des lignes, vous pouvez utiliser cette réponse: stackoverflow.com/questions/5901758/... Mais cela inclut des espaces
GeneCode

Réponses:


126

Découvrez CLOC .

cloc compte les lignes vierges, les lignes de commentaires et les lignes physiques du code source dans de nombreux langages de programmation.

( Les versions héritées sont archivées sur SourceForge .)


11
CLOC est disponible via Homebrew. La facilité d'utilisation de la ligne de commande était rafraîchissante.
avelis

1
J'adore le jeu de mots dans le nom là-bas - oui, vous pouvez dire à quel point vous avez été productif en consultant votre CLOC.
bobobobo

Utilisez le lien ci-dessus pour télécharger la version perm './cloc-1.56.pl' de l'outil cloc. Assurez-vous que vous activez l'autorisation d'exécution sur le fichier cloc-1.56.pl à l'aide de la commande 'chmod u + x cloc-1.56.pl'. Si votre code source se trouve dans le répertoire 'project_code', il vous suffit d'exécuter la commande suivante.
JZ.

233

Je vois cela flotter et je l'utilise moi-même:

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

2
Pour gérer les sous-répertoires avec des espaces dans les noms dont vous avez besoin: find. "(" -nom " .m" -ou -nom " .mm" -ou -nom "* .cpp" ")" -print0 | xargs -0 wc -l
Matt__C

2
Ce billet de blog peut vous aider: allara.blogspot.co.uk/2010/12/…
Eric Brotto

12
Nous publions des réponses sur SO, pas des liens vers des entrées de blog qui fournissent à peu près la même réponse.
Joshua Nozzi

6
il semble que les tests .m et .mm manquent un * (édité: semble que SO ne rend pas ceux sans barre oblique précédente) Ce qui précède ne fonctionnait pas pour moi jusqu'à ce que je les ai ajoutés comme tels: find. "(" -nom "* .m" -ou -nom "* .mm" -ou -nom "* .cpp" ")" -print0 | xargs -0 wc -l
bladnman

2
Remarque pour les utilisateurs de Swift - remplacez ou ajoutez un autre 'ou' avec l'extension de fichier .swift
Byron Coetsee

79

J'utilise CLOC comme mentionné parNathan Kinsinger et il est assez facile à utiliser. C'est un script PERL que vous pouvez ajouter et exécuter à partir du répertoire de votre projet.

PERL fait déjà partie de Mac OS et vous pouvez appeler le script de cette façon pour connaître le nombre de lignes que vous avez écrites:

perl cloc-1.56.pl ./YourDirectoryWhereYourSourcesAre

Ceci est un exemple de sortie que j'ai obtenu d'une telle commande:

   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
-------------------------------------------------------------------------------

4
Agréable! J'aime mieux cela que ma propre réponse. :-)
Joshua Nozzi

1
Vous devrez peut-être d'abord télécharger le script. Accédez ensuite au répertoire où se trouve ce script et exécutez cette commande avec le nom de fichier que vous avez téléchargé.
prolfe

Doit être cloc perl-1.56.pl ./YourDirectoryWhereYourSourcesAre et pas comme ci-dessus, si vous installez perl à partir de zéro, assurez-vous d'entrer la version actuelle de perl (la mienne était 5.30.1 donc fondamentalement cloc perl-5.30.1.pl ./)
Golan Shay

1
Une dernière chose, j'ai dû exécuter span Moo selon l'erreur qui est apparue lors de son exécution pour la première fois, alors vérifiez celle-ci également
Golan Shay

50

Ouvrez Terminal.app, accédez au répertoire racine de votre projet et exécutez cette commande:

Pour Swift uniquement:

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

Pour Obj-C uniquement:

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

Pour Obj-C + Swift:

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

Pour 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 '{}' \+

Quelques conseils Terminal:
ls: Contenu répertoire liste
cd: changer le répertoire
onglet Appuyez sur pour saisie semi - automatique
Rappelez - vous de mettre « \ » barre oblique inverse avant espaces que
je suggère d' aller un dossier vers le bas du projet principal afin que vous vous débarrasser de comptage de code à partir des cadres


44

Dans le terminal, accédez au répertoire du projet et exécutez:

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

Si vous ne voulez que certains types de fichiers, essayez quelque chose comme

find . -type f -name \*.[ch]* -print0 | xargs -0 cat | wc -l

Bien, mais comprend des commentaires et des lignes vides et n'est donc pas exactement ce qui a été demandé. Une mesure LOC doit être aussi indépendante que possible du style de formatage du code et donc un tas de lignes vides ou de commentaires entre les parties logiques d'un fichier ne doit pas compter dans la somme.
bassim

34

Consultez Xcode Statistician, il fait exactement ce que vous voulez. Il fournit également d'autres statistiques intéressantes, il vaut donc la peine de courir pour le plaisir de temps en temps.

Notez qu'il ne cherchera pas à l'intérieur de vrais dossiers, bien qu'il cherchera dans des groupes. Il y a de fortes chances que vous n'utilisiez pas de vrais dossiers, donc cela fonctionnera très bien. Si vous utilisez des dossiers, il vous suffit de faire le décompte dans chaque dossier et de les ajouter ensemble.

Remarque: depuis juin 2012, il semble que cela ne fonctionne pas correctement avec les dernières versions de Xcode.


Juste un avertissement pour ceux qui mélangent Objective-C et C / C ++: cela ne compte pas les fichiers * .c ou * .cpp.
Emile Cormier

3
Notez que Xcode Statisician ne gère pas les sous-répertoires de votre projet à ce stade.
Matt__C

@Matt__C Aye, d'où "Notez qu'il ne cherchera pas à l'intérieur de vrais dossiers". Un peu plus de travail manuel, malheureusement (et la recherche récursive de dossier est facile à coder), mais c'est réalisable.
Matthew Frederick

1
Il semble que cela ne fonctionne pas du tout avec les projets X-Code 4.2 sur Lion (au moins, il n'a donné aucune statistique pour mon projet)
BadPirate

Ah, dommage, il est peut-être dépassé maintenant.
Matthew Frederick

31
  1. terminal ouvert
  2. accédez à votre projet
  3. exécutez la commande suivante dans votre projet:

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

    Ou:

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

(* À l'exclusion du nombre de fichiers pod du nombre total)


16

Si vous allez dans le répertoire de votre projet dans le terminal et entrez:

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

Cela vous donnera une ventilation du projet, ainsi que le total des lignes pour chaque fichier et le projet dans son ensemble.


Pour swift vient de tout supprimer et a ajouté .swiftfind . "(" -name "*.swift" ")" -print0 | xargs -0 wc -l
WCByrne

@WCByrne Alternativement, nous pouvons simplement ajouter .swift à la commande d'origine
RileyE

En effet. Comme la plupart des bibliothèques et du code emprunté sont toujours en .h & .m, cela a aidé à réduire le compte à rebours à ce que j'avais écrit.
WCByrne

1
Absolument. Chacun a sa propre solution. Et s'ils ont leur propre préfixe (par exemple: "RE"), ils pourraient même le fairefind . "(" -name "RE*.swift" ")" -print0 | xargs -0 wc -l
RileyE

9

La version de Nozzi ne fonctionne pas pour moi, mais celle-ci:

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

1
court et concis - mais il compte également les lignes sur les fichiers sans code source. En fait, le filtrage des extensions de nom de fichier est donc crucial ici. L'OP voulait compter les "lignes de code source". pas de lignes de texte.
Motti Shneor

7

Un moyen simple et rapide:

Utilisez une recherche regex (Find Navigator, choisissez Find> Regular Expression).

. \ n

Fonctionne facilement avec les étendues de recherche Xcode et vous pouvez facilement le personnaliser en fonction du type de ligne que vous souhaitez compter;).


Maintenant, c'est une belle! pas le plus rapide, mais sans quitter l'environnement de développement. Je l'aime. Une meilleure expression régulière peut probablement éviter de compter les lignes d'espace blanc et des choses comme ça.
Motti Shneor

Rester simple. Je l'aime.
devios1

6

Vous pouvez installer SLOCCount via MacPorts. Ou, plus grossièrement, vous pouvez utiliser wc -l.


CLOC est basé sur SCLOCount donc je suppose que c'est toujours une meilleure approche pour utiliser CLOC
tiguero

4
"Coût total estimé de développement = 1 934 715 $". Cela a fait ma journée!
Valeriy Van

4

Je ne suis pas familier avec xcode, mais si tout ce dont vous avez besoin est de compter le nombre de lignes de tous ces fichiers spécifiques dans une arborescence de répertoires, vous pouvez utiliser la commande suivante:

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

Suite à la réponse de Joshua Nozzi , dans GNU, trouver l'expression régulière pour de tels fichiers serait comme:

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

ou même

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

celui - ci utilise une expression régulière pour correspondre à tous les fichiers se terminant soit .m, .mm, .cppou .swift. Vous pouvez voir plus d'informations sur ces expressions dans Comment utiliser regex dans la recherche de fichiers .

Si vous travaillez avec Mac OS find , vous avez besoin d'une approche légèrement différente, comme l'explique Motti Shneor dans les commentaires:

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

Les deux fourniront une sortie sous la forme de:

234 ./file1
456 ./file2
690 total

Ainsi, vous pouvez soit le garder comme ça, soit simplement le diriger vers tail -1(c'est-à-dire find ... | tail -1) pour que vous obteniez simplement la dernière ligne étant le total.


bien --- la recherche -regex ". * \. etc ne fonctionne pas pour moi sur MacOS - elle revendique une option illégale - quel genre de recherche utilisez-vous?
Motti Shneor

@MottiShneor vous voudrez probablement vérifier cette question où ils parlent \|et d'autres sous MacOS. --regexest valide à la fois dans GNU find (celui que j'utilise) et MacOS.
fedorqui 'SO arrêtez de nuire'

et bien non. J'ai découvert dans MacOS que vous devez trouver -E pour les expressions régulières étendues. Copiez la commande suggérée ci-dessus sur tout OS-X que vous pouvez obtenir et voyez par vous-même. man find sur MacOS-X vous dit que vous devez -E pour cela.
Motti Shneor

Enfin, vous devez également fournir un chemin où rechercher sur OSX. donc la variante qui fonctionne ressemble à ceci: find -E. -regex ". * \. ([hmc] | mm | cp + | swift | pch) $" -exec wc -l {} +
Motti Shneor

@MottiShneor merci d'avoir fourni l'approche sous MacOS. J'ai mis à jour la réponse avec cela.
fedorqui 'SO arrêtez de nuire'

2

Désolé de répéter. C'est le moyen le plus simple à mon humble avis:

  1. En type de terminal

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

Cela copiera tous les fichiers du dossier du projet vers newFolder.

  1. Téléchargez Xcode Statistician et utilisez-le avecnewFolder entrez la description de l'image ici

Cet outil ne trouve pas tout, il ressemble plus à ce qu'il ne regarde que dans le dossier actuel (pas même les sous-dossiers)
Daniel

J'ai écrit que la première étape consiste à copier tous les fichiers du dossier de projet dans un dossier.
Nik Kov

Est-ce que c'est l'open source "XcodeStatistican" par hasard? Je le ferais fonctionner sur n'importe quelle structure de projet en un rien de temps ... Les itérateurs de répertoires et de fichiers ne sont pas si difficiles à faire. De plus - le téléchargement d'ici - n'est pas signé par un développeur identifié - il pourrait donc s'agir d'un logiciel malveillant: /
Motti Shneor

1

line-counterest une bonne alternative. Il est plus léger que CLOC et beaucoup plus puissant et plus facile à utiliser que les autres commandes.

Un aperçu rapide

Voici comment vous obtenez l'outil

$ pip install line-counter

Utilisez la linecommande pour obtenir le nombre de fichiers et le nombre de lignes dans le répertoire actuel (récursivement)

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

Si vous voulez plus de détails, utilisez simplement 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

Et la meilleure partie de cet outil est que vous pouvez y ajouter .gitignore comme un fichier de configuration. Vous pouvez définir des règles pour sélectionner ou ignorer le type de fichiers à compter, comme ce que vous faites dans «.gitignore». Oui, cet outil est juste inventé pour savoir combien de lignes j'ai plus facilement.

Plus de description et d'utilisation sont ici: https://github.com/MorganZhang100/line-counter

Je suis l'auteur de cet outil simple. J'espère que cela peut aider quelqu'un.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.