2009-04-26 9 views

Respuesta

96

En un sistema operativo POSIX (por ejemplo, Linux o OS X) se puede escribir lo siguiente en su intérprete de comandos:

wc -l `find . -iname "*.php"` 

Esto cuenta las líneas en todos los archivos PHP en el directorio actual y también los subdirectorios . (Tenga en cuenta que esas "comillas" simples son marcadores, no comillas simples)

+2

Y si usted está en Windows, puede descargar e instalar Cygwin, y hacer lo mismo. Dado que Mac se ejecuta ahora también sobre un sistema operativo BSD, considero que esta es la respuesta definitiva. –

+1

Tenga en cuenta que si tiene muchos archivos de plantillas PHP y/u otros archivos PHP con código PHP/HTML mixto, esto no excluirá las líneas solo HTML. –

+1

Hay un límite para la longitud del comando en el shell; las grandes bases de código excederán esto. – eukras

13

SLOCCount es una herramienta increíble que produce un informe de recuento de líneas para una gran cantidad de idiomas. También va más allá al producir otras estadísticas relacionadas, como el costo esperado del desarrollador.

He aquí un ejemplo:

$ sloccount . 
Creating filelist for experimental 
Creating filelist for prototype 
Categorizing files. 
Finding a working MD5 command.... 
Found a working MD5 command. 
Computing results. 


SLOC Directory SLOC-by-Language (Sorted) 
10965 experimental cpp=5116,ansic=4976,python=873 
832  prototype  cpp=518,tcl=314 


Totals grouped by language (dominant language first): 
cpp:   5634 (47.76%) 
ansic:   4976 (42.18%) 
python:   873 (7.40%) 
tcl:   314 (2.66%) 




Total Physical Source Lines of Code (SLOC)    = 11,797 
Development Effort Estimate, Person-Years (Person-Months) = 2.67 (32.03) 
(Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05)) 
Schedule Estimate, Years (Months)       = 0.78 (9.33) 
(Basic COCOMO model, Months = 2.5 * (person-months**0.38)) 
Estimated Average Number of Developers (Effort/Schedule) = 3.43 
Total Estimated Cost to Develop       = $ 360,580 
(average salary = $56,286/year, overhead = 2.40). 
SLOCCount, Copyright (C) 2001-2004 David A. Wheeler 
SLOCCount is Open Source Software/Free Software, licensed under the GNU GPL. 
SLOCCount comes with ABSOLUTELY NO WARRANTY, and you are welcome to 
redistribute it under certain conditions as specified by the GNU GPL license; 
see the documentation for details. 
Please credit this data as "generated using David A. Wheeler's 'SLOCCount'." 
9

Desafortunadamente, SLOCCount es un poco largo en el diente y un dolor en el cuello para proyectos de PHP, en particular los que tienen un vendor directorio anidado que no desea contado. Además, emite una advertencia para cada archivo PHP que no tiene una etiqueta de cierre (que debería ser todos si no está mezclando HTML y PHP).

CLOC es una alternativa más moderna que hace de todo (editar: casi todo) SLOCCount sí, pero también admite una opción --exclude-dir y no sufre el problema de etiqueta de cierre antes mencionado. También emite una base de datos SQLite de la que puedes extraer algunas métricas bastante avanzadas.

+1

No hace todo lo que hace SLOCCount, aún +1. –

+0

Interesante. ¿Qué no hace? – Shabbyrobe

+0

Estaba buscando las estimaciones de tiempo/costo/persona y no pude encontrar ninguna opción en la página de manual que las devuelve. –

20

Me hice un pequeño script para hacer eso en uno de mis proyectos. Simplemente use el siguiente código en una página php en la raíz de su proyecto. El script hará un control recursivo en las subcarpetas.

<?php 
/** 
* A very simple stats counter for all kind of stats about a development folder 
* 
* @author Joel Lord 
* @copyright Engrenage (www.engrenage.biz) 
* 
* For more information: [email protected] 

*/ 


$fileCounter = array(); 
$totalLines = countLines('.', $fileCounter); 
echo $totalLines." lines in the current folder<br>"; 
echo $totalLines - $fileCounter['gen']['commentedLines'] - $fileCounter['gen']['blankLines'] ." actual lines of code (not a comment or blank line)<br><br>"; 

foreach($fileCounter['gen'] as $key=>$val) { 
    echo ucfirst($key).":".$val."<br>"; 
} 

echo "<br>"; 

foreach($fileCounter as $key=>$val) { 
    if(!is_array($val)) echo strtoupper($key).":".$val." file(s)<br>"; 
} 




function countLines($dir, &$fileCounter) { 
    $_allowedFileTypes = "(html|htm|phtml|php|js|css|ini)"; 
    $lineCounter = 0; 
    $dirHandle = opendir($dir); 
    $path = realpath($dir); 
    $nextLineIsComment = false; 

    if($dirHandle) { 
     while(false !== ($file = readdir($dirHandle))) { 
      if(is_dir($path."/".$file) && ($file !== '.' && $file !== '..')) { 
       $lineCounter += countLines($path."/".$file, $fileCounter); 
      } elseif($file !== '.' && $file !== '..') { 
       //Check if we have a valid file 
       $ext = _findExtension($file); 
       if(preg_match("/".$_allowedFileTypes."$/i", $ext)) { 
        $realFile = realpath($path)."/".$file; 
        $fileHandle = fopen($realFile, 'r'); 
        $fileArray = file($realFile); 
        //Check content of file: 
        for($i=0; $i<count($fileArray); $i++) { 
         if($nextLineIsComment) { 
          $fileCounter['gen']['commentedLines']++; 
          //Look for the end of the comment block 
          if(strpos($fileArray[$i], '*/')) { 
           $nextLineIsComment = false; 
          } 
         } else { 
          //Look for a function 
          if(strpos($fileArray[$i], 'function')) { 
           $fileCounter['gen']['functions']++; 
          } 
          //Look for a commented line 
          if(strpos($fileArray[$i], '//')) { 
           $fileCounter['gen']['commentedLines']++; 
          } 
          //Look for a class 
          if(substr(trim($fileArray[$i]), 0, 5) == 'class') { 
           $fileCounter['gen']['classes']++; 
          } 
          //Look for a comment block 
          if(strpos($fileArray[$i], '/*')) { 
           $nextLineIsComment = true; 
           $fileCounter['gen']['commentedLines']++; 
           $fileCounter['gen']['commentBlocks']++; 
          } 
          //Look for a blank line 
          if(trim($fileArray[$i]) == '') { 
           $fileCounter['gen']['blankLines']++; 
          } 
         } 

        } 
        $lineCounter += count($fileArray); 
       } 
       //Add to the files counter 
       $fileCounter['gen']['totalFiles']++; 
       $fileCounter[strtolower($ext)]++; 
      } 
     } 
    } else echo 'Could not enter folder'; 

    return $lineCounter; 
} 

function _findExtension($filename) { 
    $filename = strtolower($filename) ; 
    $exts = split("[/\\.]", $filename) ; 
    $n = count($exts)-1; 
    $exts = $exts[$n]; 
    return $exts; 
} 
+0

Wow, qué código perfecto para cualquier programador. ¿Calcula sus propias líneas? – quantme

+0

Produce mucho ruido ... Las matrices y otros valores no se inicializan cuando se usan. – Nux

+0

Me encanta. Gracias. – EngineerCoder

3

El SLOCs de un proyecto PHP puede contar con sloccount usar algo como esto:

find . -not -wholename '*/libraries/*' -not -wholename '*/lib/*' -not -wholename '*/vendor/*' -type f xargs sloccount 

Salida de ejemplo para un proyecto SizeY Drupal:

[...] 
SLOC Directory SLOC-by-Language (Sorted) 
44892 top_dir   pascal=33176,php=10293,sh=1423 


Totals grouped by language (dominant language first): 
pascal:  33176 (73.90%) 
php:   10293 (22.93%) 
sh:   1423 (3.17%) 

Total Physical Source Lines of Code (SLOC)    = 44,892 
Development Effort Estimate, Person-Years (Person-Months) = 10.86 (130.31) 
(Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05)) 
Schedule Estimate, Years (Months)       = 1.33 (15.91) 
(Basic COCOMO model, Months = 2.5 * (person-months**0.38)) 
Estimated Average Number of Developers (Effort/Schedule) = 8.19 
Total Estimated Cost to Develop       = $ 1,466,963 
(average salary = $56,286/year, overhead = 2.40). 
SLOCCount, Copyright (C) 2001-2004 David A. Wheeler 
SLOCCount is Open Source Software/Free Software, licensed under the GNU GPL. 
SLOCCount comes with ABSOLUTELY NO WARRANTY, and you are welcome to 
redistribute it under certain conditions as specified by the GNU GPL license; 
see the documentation for details. 
Please credit this data as "generated using David A. Wheeler's 'SLOCCount'." 
1
<?php 
passthru('wc -l `find . -iname "*.php"`'); 
?> 

Sólo tiene que ejecutar esto en su directorio actual donde se colocan todos los archivos php, mostrará las líneas de recuento en el navegador.

5

En las ventanas de una línea de comandos:

findstr /R /N "^" *.php | find /C ":" 

Gracias a this article.

Incluir subdirectorios, utilice \s :

findstr /s /R /N "^" *.php | find /C ":" 
+0

Método rápido que funciona bien para Windows, pero no incluye subcarpetas. –

+1

@Frogga Simple, solo agrega '\ s', mira editar – weston

Cuestiones relacionadas