¿Cómo obtener algunas buenas estadísticas sobre mi código F #?Líneas de código y otras métricas en F #
que podía imaginar cosas como
- número de líneas de mi código
- número de archivos
- número de caracteres?
- número de funciones, clases, módulos, etc
¿Cómo obtener algunas buenas estadísticas sobre mi código F #?Líneas de código y otras métricas en F #
que podía imaginar cosas como
Por qué no utilizar algunos de utilidad de shell simples?
Respuestas en orden
wc -l *.fs
ls -l *.fs | wc -l
wc -c *.fs
grep module *.fs | wc -l
grep type *.fs | wc -l
grep "^let\|member" *.fs | wc -l
Actualización: Algunos ejemplos de carpetas recursivas - espero que el patrón es obvio
wc -l `find . -name "*.fs" `
find . -name "*.fs" | wc -l
wc -c `find . -name "*.fs" `
grep module `find . -name "*.fs" ` | wc -l
Aquí es una versión # F, que cuenta con dos fs
y fsx
archivos de forma recursiva (suponiendo que tiene instalado F # runtime):
open System.IO
open System.Text.RegularExpressions
let rec allFiles dir =
seq { yield! Directory.GetFiles dir
yield! Seq.collect allFiles (Directory.GetDirectories dir) }
let rgType = new Regex(@"type", RegexOptions.Compiled)
let rgModule = new Regex(@"module", RegexOptions.Compiled)
let rgFunction = new Regex(@"^let|member", RegexOptions.Compiled)
let count (rg: Regex) s =
s |> rg.Matches |> fun x -> x.Count
type Statistics = {
NumOfLines: int; NumOfFiles: int;
NumOfChars: int; NumOfTypes: int;
NumOfModules: int; NumOfFunctions: int;
}
let getStats =
allFiles
>> Seq.filter (fun f -> f.EndsWith ".fs" || f.EndsWith ".fsx")
>> Seq.fold (fun acc f ->
let contents = f |> File.ReadLines
{ NumOfLines = acc.NumOfLines + Seq.length contents;
NumOfFiles = acc.NumOfFiles + 1;
NumOfChars = acc.NumOfChars + Seq.sumBy String.length contents;
NumOfTypes = acc.NumOfTypes + Seq.sumBy (count rgType) contents;
NumOfModules = acc.NumOfModules + Seq.sumBy (count rgModule) contents;
NumOfFunctions = acc.NumOfFunctions + Seq.sumBy (count rgFunction) contents; }
) { NumOfLines = 0; NumOfFiles = 0;
NumOfChars = 0; NumOfTypes = 0;
NumOfModules = 0; NumOfFunctions = 0 }
Creo que su 'let' regex no será correcta. Creo que es más correcto si lo ancla para que el 'let' debe estar al comienzo de una línea. –
Gracias. La expresión regular no es exhaustiva, ya que no reconoce 'let estático' o diferencia entre funciones y valores. – pad
Debido F # compilar a código IL y Common Type System (CTS) y PDB files, F # asambleas pueden ser analizados por la herramienta NDepend y obtendrá 82 code metrics acerca de su código (+ todos los others features of the tool). Una versión de prueba gratuita está disponible here.
Descargo de responsabilidad, soy miembro del equipo NDepend.
bueno, buena idea recurrir al análisis de código IL, pero debido a la forma en que el compilador F # produce código, la mayoría de las métricas de código basadas en IL no tendrán sentido. – citykid
¡Bonito! ¿Cómo lo ejecuto? Uso Windows 7 + VS 2010 –
Estas son todas las herramientas de línea de comandos estándar de Unix. Todos están incluidos en cygwin en http://www.cygwin.com/. –
Gracias. Una última pregunta. ¿Hay alguna manera de llamar de manera recursiva los comandos en todas las subcarpetas? –