2012-05-02 37 views
7

में कोड और अन्य मीट्रिक की रेखाएं मेरे एफ # कोड के बारे में कुछ अच्छे आंकड़े कैसे प्राप्त करें?एफ #

मैं की तरह

  • मेरी कोड फ़ाइलों का
  • संख्या
  • वर्णों की संख्या की लाइनों की संख्या चीजों की कल्पना कर सकता है?
  • काम करता है, वर्गों की संख्या, मॉड्यूल आदि

उत्तर

9

क्यों नहीं कुछ सरल खोल उपयोगिताओं का उपयोग करें? क्रम में

जवाब

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 

अद्यतन: पुनरावर्ती फ़ोल्डरों के लिए कुछ उदाहरण - मुझे आशा है कि पैटर्न स्पष्ट है

wc -l `find . -name "*.fs" ` 
find . -name "*.fs" | wc -l 
wc -c `find . -name "*.fs" ` 
grep module `find . -name "*.fs" ` | wc -l 
+0

अच्छा! मैं इसे कैसे चला सकता हूं? मैं विंडोज 7 + वीएस 2010 –

+0

का उपयोग करता हूं ये सभी मानक यूनिक्स कमांड लाइन टूल्स हैं। वे सभी http://www.cygwin.com/ पर साइगविन में शामिल हैं। –

+0

धन्यवाद। एक आखिरी सवाल। क्या सभी तरह के सब-फ़ोल्डर्स पर कमांड को कॉल करने का कोई तरीका है? –

4
यहाँ

है एक एफ # संस्करण है जो दोनों fs और fsx फ़ाइलों रिकर्सिवली मायने रखता है (मान लें कि आपके पास एफ # रनटाइम स्थापित है):

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 } 
+0

में अपडेट मुझे लगता है कि आपका 'let' regex सही नहीं होगा। मुझे लगता है कि अगर आप इसे एंकर करते हैं तो यह अधिक सही होता है ताकि 'लेट' लाइन की शुरुआत में हो। –

+0

धन्यवाद। रेगेक्स संपूर्ण नहीं है क्योंकि यह 'स्थैतिक चलो' को पहचानता नहीं है या कार्यों और मूल्यों के बीच अंतर करता है। – pad

0

एफ # आईएल कोड और आम प्रकार सिस्टम (सीटीएस) और PDB files के संकलन वजह से, एफ # विधानसभाओं उपकरण NDepend द्वारा विश्लेषण किया जा सकता है और आप अपने कोड (+ सभी others features of the tool) के बारे में 82 code metrics मिलेगा। एक नि: शुल्क परीक्षण संस्करण here उपलब्ध है।

अस्वीकरण, मैं एनडीपेन्स टीम का सदस्य हूं।

+2

अच्छी तरह से, आईएल कोड विश्लेषण को दोबारा शुरू करने का अच्छा विचार है, लेकिन जिस तरह से एफ # कंपाइलर कोड उत्पन्न करता है, आईएल पर आधारित अधिकांश कोड मीट्रिक अर्थहीन होंगे। – citykid