2010-10-17 11 views
45

Próbowałem rake stats, ale wydaje się to bardzo niedokładne. Być może ignoruje kilka katalogów?Jak liczyć wiersze kodu?

+0

niestety wiem. Nie chciałem hackować ani instalować garści klejnotów. Ciągle szukam prostego, eleganckiego rozwiązania. – AnApprentice

Odpowiedz

14

Możesz wypróbować te dwie opcje:

  1. Hack rake stats

Rakestats snippet z blogpost:

namespace :spec do 
    desc "Add files that DHH doesn't consider to be 'code' to stats" 
    task :statsetup do 
    require 'code_statistics' 

    class CodeStatistics 
    alias calculate_statistics_orig calculate_statistics 
    def calculate_statistics 
     @pairs.inject({}) do |stats, pair| 
     if 3 == pair.size 
      stats[pair.first] = calculate_directory_statistics(pair[1], pair[2]); stats 
     else 
      stats[pair.first] = calculate_directory_statistics(pair.last); stats 
     end 
     end 
    end 
    end 
    ::STATS_DIRECTORIES << ['Views', 'app/views', /\.(rhtml|erb|rb)$/] 
    ::STATS_DIRECTORIES << ['Test Fixtures', 'test/fixtures', /\.yml$/] 
    ::STATS_DIRECTORIES << ['Email Fixtures', 'test/fixtures', /\.txt$/] 
    # note, I renamed all my rails-generated email fixtures to add .txt 
    ::STATS_DIRECTORIES << ['Static HTML', 'public', /\.html$/] 
    ::STATS_DIRECTORIES << ['Static CSS', 'public', /\.css$/] 
    # ::STATS_DIRECTORIES << ['Static JS', 'public', /\.js$/] 
    # prototype is ~5384 LOC all by itself - very hard to filter out 

    ::CodeStatistics::TEST_TYPES << "Test Fixtures" 
    ::CodeStatistics::TEST_TYPES << "Email Fixtures" 
    end 
end 
task :stats => "spec:statsetup" 
  1. metric_fu - Ruby Klejnot do łatwego generowania raportów metrycznych

PS: Nie próbowałem żadnego z powyższych, ale metric_fu brzmi interesująco, zobacz zrzuty ekranowe wyjścia.

29

Oto proste rozwiązanie. Zlicza linie kodu w folderze aplikacji projektu rails - CSS, Ruby, CoffeeScript i inne. U podstaw projektu, uruchom polecenie:

find ./app -type f | xargs cat | wc -l 
+2

i kilka rzędów wielkości szybciej niż cloc, jeśli nie dbasz o semantykę linii, którą zliczasz – pje

+8

Naprawdę nie jestem pewna, dlaczego tak bardzo wzniesiono się do głosu. Po prostu zlicza linie pliku, w tym puste wiersze i komentarze z dowolnego kodu źródłowego, pliki konfiguracyjne, pliki dziennika, pliki binarne, aby głośno krzyczeć. To ** bardzo ** różni się od LOC, przez dowolną możliwą definicję tego, co stanowi linię kodu . W moim bieżącym projekcie szynowym, zgłasza to 35K linii, w porównaniu do znacznie dokładniejszych 19K ze stada. – Thilo

+0

@Thilo, to właściwie nie liczy plików konfiguracyjnych ani binarnych, ponieważ szuka w folderze ./app. Choć wystarczająco sprawiedliwe, istnieje wiele rozwiązań do wszystkiego. –

94

używam darmowy skrypt Perl cloc. Przykładowe użycie:

phrogz$ cloc . 
    180 text files. 
    180 unique files.           
     77 files ignored. 

http://cloc.sourceforge.net v 1.56 T=1.0 s (104.0 files/s, 19619.0 lines/s) 
------------------------------------------------------------------------------- 
Language      files   blank  comment   code 
------------------------------------------------------------------------------- 
Javascript      29   1774   1338   10456 
Ruby       61   577   185   4055 
CSS        10   118   133   783 
HTML        1    13    3   140 
DOS Batch      2    6    0    19 
Bourne Shell      1    4    0    15 
------------------------------------------------------------------------------- 
SUM:       104   2492   1659   15468 
------------------------------------------------------------------------------- 
+40

'brew install cloc' – Chip

+4

wydaje się, że nie obsługuje plików widoku' erb'. 'cloc app/views': 100 plików tekstowych. 96 unikalnych plików. Zignorowano 100 plików. ** Aktualizacja: 'cloc app/views --force-lang = html, erb' ** – Mifeng

+0

@Mifeng Wielkie dzięki! Możesz zrobić to samo z jadeitem, który również nie jest obsługiwany po wyjęciu z pudełka. na przykład. 'cloc example/jadeviews --force-lang = html, jade' – Automatico

9

Ten oblicza liczbę plików, całkowite wiersze kodu, komentarze i średnią LOC na plik. Wyklucza również pliki wewnątrz katalogów z "dostawcą" w ich nazwie.

Zastosowanie:

count_lines('rb') 

Kod:

def count_lines(ext) 

    o = 0 # Number of files 
    n = 0 # Number of lines of code 
    m = 0 # Number of lines of comments 

    files = Dir.glob('./**/*.' + ext) 

    files.each do |f| 
    next if f.index('vendor') 
    next if FileTest.directory?(f) 
    o += 1 
    i = 0 
    File.new(f).each_line do |line| 
     if line.strip[0] == '#' 
     m += 1 
     next 
     end 
     i += 1 
    end 
    n += i 
    end 

    puts "#{o.to_s} files." 
    puts "#{n.to_s} lines of code." 
    puts "#{(n.to_f/o.to_f).round(2)} LOC/file." 
    puts "#{m.to_s} lines of comments." 

end 
+2

To jest takie proste, jest piękne " – baash05