¿Cómo saber cuántas líneas de código hay en un proyecto Xcode?

149

¿Hay alguna manera de determinar cuántas líneas de código contiene un proyecto Xcode? Prometo no utilizar dicha información para fines de medición gerencial o de evaluación comparativa de empleados. ;)

Dave
fuente
Si desea líneas, puede usar esta respuesta: stackoverflow.com/questions/5901758/… Pero incluye espacios
GeneCode

Respuestas:

126

Echa un vistazo a CLOC .

cloc cuenta líneas en blanco, líneas de comentarios y líneas físicas de código fuente en muchos lenguajes de programación.

(Las compilaciones heredadas se archivan en SourceForge ).

Nathan Kinsinger
fuente
11
CLOC está disponible a través de Homebrew. La facilidad de uso en la línea de comandos fue refrescante.
avelis
1
Me encanta el juego de palabras en el nombre allí: sí, puedes ver cuán productivo has sido al revisar tu CLOC.
bobobobo
Utilice el enlace de arriba para descargar la versión permanente './cloc-1.56.pl' de la herramienta cloc. Asegúrese de habilitar el permiso de ejecución en el archivo cloc-1.56.pl usando el comando 'chmod u + x cloc-1.56.pl'. Si su código fuente se encuentra en el directorio 'project_code' Solo necesita ejecutar el siguiente comando.
JZ.
233

Veo esto flotando y lo uso yo mismo:

find . "(" -name "*.m" -or -name "*.mm" -or -name "*.cpp" -or -name "*.swift" ")" -print0 | xargs -0 wc -l
Joshua Nozzi
fuente
2
Para manejar subdirecciones con espacios en los nombres que necesita: buscar. "(" -name " .m" -o -name " .mm" -o -name "* .cpp" ")" -print0 | xargs -0 wc -l
Matt__C
2
Esta publicación de blog puede ayudar: allara.blogspot.co.uk/2010/12/…
Eric Brotto
12
Publicamos respuestas en SO, no enlaces a entradas de blog que proporcionan la misma respuesta.
Joshua Nozzi
66
parece que a las pruebas .m y .mm les falta un * (editado: parece que SO no las muestra sin una barra inclinada anterior) Lo anterior no me funcionó hasta que las agregué como tales: find. "(" -name "* .m" -o -name "* .mm" -o -name "* .cpp" ")" -print0 | xargs -0 wc -l
bladnman
2
Nota para usuarios de Swift: reemplace o agregue otro 'o' con la extensión de archivo .swift
Byron Coetsee
79

He estado usando CLOC como lo mencionéNathan Kinsinger y es bastante fácil de usar. Es un script PERL que puede agregar y ejecutar desde el directorio de su proyecto.

PERL ya forma parte de Mac OS y puede invocar el script de esta manera para averiguar la cantidad de líneas que ha escrito:

perl cloc-1.56.pl ./YourDirectoryWhereYourSourcesAre

Este es un ejemplo de salida que obtuve de dicho comando:

   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
fuente
44
¡Agradable! Me gusta más que mi propia respuesta. :-)
Joshua Nozzi
1
Es posible que primero necesite descargar el script. Luego navegue al directorio donde está ese script y ejecute ese comando con cualquier nombre de archivo que haya descargado.
prolfe
Debe ser cloc perl-1.56.pl ./YourDirectoryWhereYourSourcesAre y no como se indica arriba, si instala perl desde cero, asegúrese de ingresar la versión actual de perl (la mía era 5.30.1, así que básicamente cloc perl-5.30.1.pl ./)
Golán Shay
1
Una última cosa, tuve que ejecutar span Moo según el error que apareció cuando lo ejecuté por primera vez, así que revisa también para ese
Golan Shay
50

Abra Terminal.app, vaya al directorio raíz de su proyecto y ejecute este comando:

Solo para Swift:

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

Solo para Obj-C:

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

Para Obj-C + Swift:

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

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

Sugerencias rápidas para la terminal:
ls: enumerar el contenido del directorio
cd: cambiar directorio
Presione tab para autocompletar
Recuerde colocar la barra invertida "\" antes de los espacios
. Sugiero ir una carpeta hacia abajo desde el proyecto principal para deshacerse del recuento de códigos de los marcos

Esqarrouth
fuente
44

En la terminal, cambie al directorio del proyecto y ejecute:

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

Si solo desea ciertos tipos de archivos, intente algo como

find . -type f -name \*.[ch]* -print0 | xargs -0 cat | wc -l
Andrew McGregor
fuente
Agradable, pero incluye comentarios y líneas en blanco y, por lo tanto, no es exactamente lo que se solicitó. Una medida LOC debe ser tan independiente del estilo de formato de código como sea posible y, por lo tanto, un montón de líneas en blanco o comentarios entre partes lógicas en un archivo no deben contar para la suma.
bassim
34

Echa un vistazo a Xcode Statistician, hace exactamente lo que quieres. También proporciona otras estadísticas interesantes, por lo que vale la pena correr por diversión de vez en cuando.

Tenga en cuenta que no se verá dentro de carpetas reales, aunque se verá en grupos. Lo más probable es que no estés usando carpetas reales, por lo que funcionará muy bien. Si está utilizando carpetas, solo tiene que hacer el recuento en cada carpeta y agregarlas juntas.

Nota: A partir de junio de 2012, parece que esto no funciona correctamente con las últimas versiones de Xcode.

Matthew Frederick
fuente
Solo un aviso para aquellos que mezclan Objective-C y C / C ++: no cuenta con archivos * .co * .cpp.
Emile Cormier
3
Tenga en cuenta que Xcode Statisician no se ocupa de subdirecciones en su proyecto en este momento.
Matt__C
@Matt__C Sí, por lo tanto, "Tenga en cuenta que no se verá dentro de las carpetas reales". Un poco más de trabajo manual, desafortunadamente (y la búsqueda recursiva de carpetas es fácil de codificar), pero es viable.
Matthew Frederick el
1
Parece que no funciona en absoluto con los proyectos X-Code 4.2 en Lion (al menos no dio ninguna estadística para mi proyecto)
BadPirate
Ah, fastidio, puede estar desactualizado ahora.
Matthew Frederick
31
  1. terminal abierta
  2. navega a tu proyecto
  3. ejecute el siguiente comando dentro de su proyecto:

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

    O:

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

(* Excluido el recuento de archivos de pod del recuento total)

Shan Shafiq
fuente
16

Si va al directorio de su proyecto en la terminal e ingresa:

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

Eso le dará un desglose del proyecto, así como el total de la línea para cada archivo y el proyecto en su conjunto.

RileyE
fuente
Para Swiftfind . "(" -name "*.swift" ")" -print0 | xargs -0 wc -l
simplemente
@WCByrne Alternativamente, podemos agregar .swift al comando original
RileyE
En efecto. Dado que la mayoría de las bibliotecas y el código prestado todavía están en .h & .m, ayudó a reducir la cuenta regresiva a lo que había escrito.
WCByrne
1
Absolutamente. Todos tienen su propia solución. Y si tienen su propio prefijo (por ejemplo: "RE"), incluso podrían hacerlofind . "(" -name "RE*.swift" ")" -print0 | xargs -0 wc -l
RileyE
9

La versión de Nozzi no funciona para mí, pero esta:

find . -type f -print0 | xargs -0 cat | wc -l
Pascalius
fuente
1
breve y conciso, pero también cuenta líneas en archivos que no son de código fuente. Entonces, en realidad, el filtro de extensión de nombre de archivo es crucial aquí. El OP quería contar "líneas de código fuente". No hay líneas de texto.
Motti Shneor
7

Una manera rápida y fácil:

Utilice una búsqueda de expresiones regulares (Buscar navegador, elija Buscar> Expresión regular).

.\norte

Funciona convenientemente con los ámbitos de búsqueda de Xcode y puede personalizarlo fácilmente para cualquier tipo de línea que desee contar;).

Patrick Pijnappel
fuente
¡Eso sí que es bueno! No es el más rápido, pero sin abandonar el entorno de desarrollo. Me gusta. Probablemente, una mejor expresión regular puede evitar contar líneas de espacios en blanco y cosas así.
Motti Shneor
Mantenlo simple. Me gusta.
devios1
6

Puede instalar SLOCCount a través de MacPorts. O, más groseramente, puede usar wc -l.

Antonio
fuente
CLOC se basa en SCLOCount, así que supongo que todavía es un mejor enfoque para usar CLOC
tiguero
44
"Costo total estimado de desarrollo = $ 1,934,715". ¡Esto hizo mi dia!
Valeriy Van
4

No estoy familiarizado con xcode, pero si todo lo que necesita es contar el número de líneas de todos esos archivos específicos dentro de un árbol de directorios, puede usar el siguiente comando:

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

Siguiendo la respuesta de Joshua Nozzi , en GNU encontrar la expresión regular para tales archivos sería:

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

o incluso

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

Este utiliza una expresión regular para que coincida con todos los archivos que terminan en cualquiera de los dos .m, .mm, .cppo .swift. Puede ver más información sobre esas expresiones en Cómo usar expresiones regulares en la búsqueda de archivos .

Si está trabajando con Mac OS find , entonces necesita un enfoque ligeramente diferente, como lo explica Motti Shneor en los comentarios:

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

Ambos proporcionarán una salida en forma de:

234 ./file1
456 ./file2
690 total

Por lo tanto, puede mantenerlo así o simplemente canalizar tail -1(es decir find ... | tail -1) para que solo obtenga la última línea como el total.

fedorqui 'así que deja de dañar'
fuente
bueno --- el find -regex ". * \. etc no funciona para mí en MacOS - reclama una opción ilegal - ¿qué tipo de hallazgo estás usando?
Motti Shneor
@MottiShneor probablemente desee verificar esta pregunta donde hablan \|y otros en MacOS. --regexes válido tanto en GNU find (el que uso) como en MacOS.
Fedorqui 'SO deja de dañar'
bueno no. Descubrí que en MacOS debes encontrar -E para expresiones regulares extendidas. Copie el comando sugerido arriba en cualquier OS-X que pueda obtener y compruébelo usted mismo. man find en MacOS-X te dice que debes -E para eso.
Motti Shneor
Finalmente, también debe proporcionar una ruta donde buscar en OSX. entonces la variación que funciona, se ve así: find -E. -regex ". * \. ([hmc] | mm | cp + | swift | pch) $" -exec wc -l {} +
Motti Shneor
@ MottiShneor gracias por proporcionar el enfoque en MacOS. He actualizado la respuesta con eso.
Fedorqui 'así que deja de dañar'
2

Perdón por repetir. Esa es la forma más fácil en mi humilde opinión:

  1. En tipo terminal

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

Esto copiará todos los archivos de la carpeta del proyecto a newFolder.

  1. Descargue Xcode Statistician y utilícelo connewFolder ingrese la descripción de la imagen aquí
Nik Kov
fuente
Esta herramienta no encuentra todo, parece que en realidad solo se ve en la carpeta actual (ni siquiera en las subcarpetas)
Daniel
Escribí que el primer paso es copiar todos los archivos de la carpeta del proyecto a una carpeta.
Nik Kov
¿Es ese código abierto "XcodeStatistican" por casualidad? Lo haría funcionar en cualquier estructura de proyecto en poco tiempo ... Los iteradores de directorio y archivo no son tan difíciles de hacer. Además, la descarga desde aquí no está firmada por un desarrollador identificado, por lo que podría ser malware: /
Motti Shneor
1

line-counterEs una buena alternativa. Es más ligero que CLOC y mucho más potente y fácil de usar que otros comandos.

Un resumen rápido

Así es como obtienes la herramienta

$ pip install line-counter

Use el linecomando para obtener el recuento de archivos y el recuento de líneas en el directorio actual (recursivamente)

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

Si quieres más detalles, solo úsalo 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

Y la mejor parte de esta herramienta es que puede agregarle .gitignore como configurar el archivo. Puede configurar reglas para seleccionar o ignorar qué tipo de archivos contar al igual que lo que hace en '.gitignore'. Sí, esta herramienta se acaba de inventar para que sea más fácil saber cuántas líneas tengo.

Más descripción y uso está aquí: https://github.com/MorganZhang100/line-counter

Soy el autor de esta sencilla herramienta. Espero que pueda ayudar a alguien.

Morgan Zhang
fuente