Làm cách nào để có được một số thống kê tốt đẹp về mã F # của tôi?Các dòng mã và các số liệu khác trong F #
tôi có thể tưởng tượng những thứ như
- số dòng mã của tôi
- số lượng file
- số ký tự?
- số chức năng, lớp học, mô-đun, v.v.
Làm cách nào để có được một số thống kê tốt đẹp về mã F # của tôi?Các dòng mã và các số liệu khác trong F #
tôi có thể tưởng tượng những thứ như
Tại sao không sử dụng một số tiện ích shell đơn giản?
Đáp để
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
Cập nhật: Một số ví dụ cho các thư mục đệ quy - Tôi hy vọng mô hình là rõ ràng
wc -l `find . -name "*.fs" `
find . -name "*.fs" | wc -l
wc -c `find . -name "*.fs" `
grep module `find . -name "*.fs" ` | wc -l
Dưới đây là một # phiên bản F mà đếm cả fs
và fsx
file đệ quy (giả sử bạn đã cài đặt thời gian chạy F #):
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 }
Tôi nghĩ rằng 'let' regex của bạn sẽ không chính xác. Tôi nghĩ rằng nó là chính xác hơn nếu bạn neo nó để 'let' phải ở đầu của một dòng. –
Cảm ơn. Regex không đầy đủ vì nó không nhận ra 'static let' hoặc phân biệt giữa các hàm và giá trị. – pad
Vì F # biên dịch thành mã IL và Hệ thống kiểu chung (CTS) và PDB files, F # assembly có thể được phân tích bằng công cụ NDepend và bạn sẽ nhận được 82 code metrics về mã của bạn (+ tất cả others features of the tool). Phiên bản dùng thử miễn phí có sẵn here.
Tuyên bố từ chối trách nhiệm, tôi là thành viên của nhóm NDepend.
tốt, ý tưởng hay để tái phân tích mã IL, nhưng do cách trình biên dịch F # tạo mã, hầu hết các chỉ số mã dựa trên IL sẽ là vô nghĩa. – citykid
Tốt! Làm thế nào để tôi chạy nó? Tôi sử dụng Windows 7 + VS 2010 –
Đây là tất cả các công cụ dòng lệnh unix tiêu chuẩn. Tất cả đều được bao gồm trong Cygwin tại http://www.cygwin.com/. –
Cảm ơn. Một câu hỏi cuối cùng. Có cách nào để đệ quy gọi các lệnh trên tất cả các thư mục con không? –