Jak sprawdzić, ile wierszy kodu znajduje się w projekcie Xcode?

149

Czy istnieje sposób na określenie, ile wierszy kodu zawiera projekt Xcode? Obiecuję, że nie będę wykorzystywać takich informacji do pomiarów menedżerskich lub do celów benchmarkingu pracowników. ;)

Dave
źródło
Jeśli chcesz wierszy, możesz użyć tej odpowiedzi: stackoverflow.com/questions/5901758/… Ale zawiera spacje
GeneCode,

Odpowiedzi:

126

Sprawdź CLOC .

cloc liczy puste wiersze, wiersze komentarzy i fizyczne wiersze kodu źródłowego w wielu językach programowania.

( Starsze wersje są archiwizowane na SourceForge .)

Nathan Kinsinger
źródło
11
CLOC jest dostępny za pośrednictwem Homebrew. Łatwość użycia w linii poleceń była odświeżająca.
avelis
1
Uwielbiam kalambur w nazwie - tak, możesz powiedzieć, jak produktywny byłeś, sprawdzając swój CLOC.
bobobobo
Użyj powyższego linku, aby pobrać wersję perm narzędzia cloc './cloc-1.56.pl. Upewnij się, że włączasz uprawnienia do wykonywania na pliku cloc-1.56.pl za pomocą polecenia „chmod u + x cloc-1.56.pl”. Jeśli twój kod źródłowy znajduje się w katalogu „kod_projektu”, wystarczy uruchomić następujące polecenie.
JZ.
233

Widzę to unoszące się wokół i używam go sam:

find . "(" -name "*.m" -or -name "*.mm" -or -name "*.cpp" -or -name "*.swift" ")" -print0 | xargs -0 wc -l
Joshua Nozzi
źródło
2
Aby obsłużyć podkatalogi ze spacjami w nazwach, których potrzebujesz: znajdź. "(" -nazwa " .m" -lub -nazwa ".mm" -lub -nazwa "* .cpp" ")" -print0 | xargs -0 wc -l
Matt__C
2
Ten post na blogu może pomóc: allara.blogspot.co.uk/2010/12/…
Eric Brotto
12
Publikujemy odpowiedzi na SO, a nie linki do wpisów na blogu, które zawierają bardzo tę samą odpowiedź.
Joshua Nozzi,
6
wygląda na to, że w testach .m i .mm brakuje znaku * (edytowane: wydaje się, że SO nie renderuje tych bez poprzedzającego ukośnika). Powyższe nie działało, dopóki nie dodałem ich jako takich: znajdź. "(" -nazwa "* .m" -lub -nazwa "* .mm" -lub -nazwa "* .cpp" ")" -print0 | xargs -0 wc -l
bladnman
2
Uwaga dla użytkowników Swift - zamień lub dodaj inny „lub” z rozszerzeniem pliku. Swift
Byron Coetsee
79

Używam CLOC, jak wspomniano,Nathan Kinsinger i jest dość łatwy w użyciu. Jest to skrypt PERL, który możesz dodać i uruchomić z katalogu projektu.

PERL jest już częścią systemu Mac OS i możesz wywołać skrypt w ten sposób, aby sprawdzić liczbę napisanych linii:

perl cloc-1.56.pl ./YourDirectoryWhereYourSourcesAre

Oto przykład danych wyjściowych, które otrzymałem z takiego polecenia:

   176 text files.
   176 unique files.                                          
     4 files ignored.

http://cloc.sourceforge.net v 1.56  T=2.0 s (86.0 files/s, 10838.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Objective C                     80           3848           1876          11844
C/C++ Header                    92            980           1716           1412
-------------------------------------------------------------------------------
SUM:                           172           4828           3592          13256
-------------------------------------------------------------------------------
tiguero
źródło
4
Miły! Podoba mi się to bardziej niż moja własna odpowiedź. :-)
Joshua Nozzi
1
Może być konieczne wcześniejsze pobranie skryptu. Następnie przejdź do katalogu, w którym znajduje się ten skrypt i uruchom to polecenie z dowolną nazwą pobranego pliku.
prolfe
Powinien być cloc perl-1.56.pl ./YourDirectoryWhereYourSourcesAre a nie jak wyżej, jeśli instalujesz perla od zera to upewnij się, że wpisujesz aktualną wersję perla (moja to 5.30.1, czyli w zasadzie cloc perl-5.30.1.pl ./)
Golan Shay
1
Ostatnia rzecz, musiałem uruchomić span Moo zgodnie z błędem, który pojawił się podczas uruchamiania go po raz pierwszy, więc sprawdź również ten
Golan Shay
50

Otwórz Terminal.app, przejdź do katalogu głównego projektu i uruchom to polecenie:

Tylko dla Swift:

find . \( -iname \*.swift \) -exec wc -l '{}' \+

Tylko dla Obj-C:

find . \( -iname \*.m -o -iname \*.mm -o -iname \*.h \) -exec wc -l '{}' \+

Dla Obj-C + Swift:

find . \( -iname \*.m -o -iname \*.mm -o -iname \*.h -o -iname \*.swift \) -exec wc -l '{}' \+

Dla Obj-C + Swift + C + C ++:

find . \( -iname \*.m -o -iname \*.mm -o -iname \*.c -o -iname \*.cc -o -iname \*.h -o -iname \*.hh -o -iname \*.hpp -o -iname \*.cpp -o -iname \*.swift \) -exec wc -l '{}' \+

Szybkie porady dotyczące terminala:
ls: lista zawartości katalogu
cd: zmień katalog
Naciśnij klawisz tabulatora, aby autouzupełnianie
Pamiętaj, aby wstawić ukośnik odwrotny „\” przed spacjami
Sugeruję przejście o jeden folder w dół od głównego projektu, aby pozbyć się liczby kodów z frameworków

Esqarrouth
źródło
44

W terminalu przejdź do katalogu projektu i uruchom:

find . -type f -print0 | xargs -0 cat | wc -l

Jeśli chcesz tylko niektóre typy plików, spróbuj czegoś takiego jak

find . -type f -name \*.[ch]* -print0 | xargs -0 cat | wc -l
Andrew McGregor
źródło
Ładnie, ale zawiera komentarze i puste wiersze, a zatem nie jest dokładnie tym, o co proszono. Miara LOC powinna być jak najbardziej niezależna od stylu formatowania kodu, a zatem kilka pustych wierszy lub komentarzy między logicznymi częściami pliku nie powinno wliczać się do sumy.
bassim
34

Sprawdź Xcode Statistician, robi dokładnie to, czego chcesz. Zawiera również inne interesujące statystyki, więc od czasu do czasu warto pobiegać dla zabawy.

Zauważ, że nie będzie wyglądał wewnątrz prawdziwych folderów, chociaż będzie wyglądał w grupach. Możliwe, że nie używasz prawdziwych folderów, więc będzie działać świetnie. Jeśli używasz folderów, musisz po prostu policzyć w każdym folderze i dodać je razem.

Uwaga: od czerwca 2012 wydaje się, że nie działa to poprawnie z najnowszymi wersjami Xcode.

Matthew Frederick
źródło
Tylko uwaga dla tych, którzy mieszają Objective-C i C / C ++: nie liczy plików * .c lub * .cpp.
Emile Cormier
3
Zauważ, że Xcode Statisician nie zajmuje się na tym etapie podkatalogami w twoim projekcie.
Matt__C
@Matt__C Tak, stąd „Zauważ, że to nie będzie wyglądać w prawdziwych folderach”. Trochę więcej pracy ręcznej, niestety (a rekurencyjne przeszukiwanie folderów jest łatwe do zakodowania), ale jest wykonalne.
Matthew Frederick,
1
Wygląda na to, że w ogóle nie działa z projektami X-Code 4.2 na Lion (przynajmniej nie dał żadnych statystyk dla mojego projektu)
BadPirate
Ach, szkoda, może być teraz nieaktualne.
Matthew Frederick
31
  1. otwórz terminal
  2. przejdź do swojego projektu
  3. wykonaj następujące polecenie w swoim projekcie:

    find . -path ./Pods -prune -o -name "*.swift" -print0 ! -name "/Pods" | xargs -0 wc -l

    Lub:

    find . -path ./Pods -prune -o -name "*[hm]" -print0 ! -name "/Pods" | xargs -0 wc -l

(* Z wyłączeniem plików pod z łącznej liczby)

Shan Shafiq
źródło
16

Jeśli przejdziesz do katalogu swojego projektu w terminalu i wpisz:

find . "(" -name "*.h" -or -name "*.m" -or -name "*.mm" -or -name "*.hpp" -or -name "*.cpp"  -or  -name "*.c" -or -name "*.cc" -or -name "*.swift" ")" -print0 | xargs -0 wc -l

To da ci podział projektu, a także sumę wierszy dla każdego pliku i projektu jako całości.

RileyE
źródło
Dla szybkiego po prostu usunąłem wszystko i dodałem .swiftfind . "(" -name "*.swift" ")" -print0 | xargs -0 wc -l
WCByrne
@WCByrne Alternatywnie możemy po prostu dodać .swift do oryginalnego polecenia
RileyE
W rzeczy samej. Ponieważ większość bibliotek i wypożyczonego kodu nadal znajduje się w .h & .m, pomogło to skrócić odliczanie do tego, co napisałem.
WCByrne
1
Absolutnie. Każdy ma swoje własne rozwiązanie. A jeśli mają własny prefiks (np. „RE”), mogą to zrobićfind . "(" -name "RE*.swift" ")" -print0 | xargs -0 wc -l
RileyE
9

Wersja Nozzi nie działa dla mnie, ale ta:

find . -type f -print0 | xargs -0 cat | wc -l
Pascalius
źródło
1
krótkie i zwięzłe - ale liczy wiersze także w plikach innych niż kod źródłowy. Tak więc w rzeczywistości filtrowanie rozszerzeń plików jest tutaj kluczowe. OP chciał policzyć „linie kodu źródłowego”. nie żadnych wierszy tekstu.
Motti Shneor
7

Szybki i łatwy sposób:

Użyj wyszukiwania regularnego (Znajdź nawigator, wybierz Znajdź> Wyrażenie regularne).

. \ n

Działa wygodnie z zakresami wyszukiwania Xcode i możesz łatwo dostosować go do dowolnego typu linii, którą chcesz policzyć;).

Patrick Pijnappel
źródło
Teraz to miło! nie najszybszy, ale bez opuszczania środowiska deweloperskiego. Lubię to. Prawdopodobnie lepsze wyrażenie regularne pozwoli uniknąć liczenia białych znaków i tym podobnych.
Motti Shneor
Nie komplikuj. Lubię to.
devios1
6

Możesz zainstalować SLOCCount przez MacPorts. Lub, prościej, możesz użyć wc -l.

antoni
źródło
CLOC jest oparty na SCLOCount, więc myślę, że nadal jest lepszym podejściem do używania CLOC
tiguero
4
„Całkowity szacowany koszt opracowania = 1 934 715 USD”. To poprawiło mój dzień!
Valeriy Van
4

Nie jestem zaznajomiony z xcode, ale jeśli wszystko, czego potrzebujesz, to policzyć liczbę wierszy ze wszystkich tych konkretnych plików w drzewie katalogów, możesz użyć następującego polecenia:

find .... match of all those files ... -exec wc -l {} +

Podążając za odpowiedzią Joshuy Nozziego , w GNU znajdź wyrażenie regularne dla takich plików:

find . "(" -name "*.m" -or -name "*.mm" -or -name "*.cpp" -or -name "*.swift" ")" -exec wc -l {} +

lub nawet

find -regex ".*\.\(m\|mm\|cpp\|swift\)$" -exec wc -l {} +

to używa wyrażenia regularnego, aby dopasować wszystkie pliki kończące się albo .m, .mm, .cpplub .swift. Więcej informacji na temat tych wyrażeń można znaleźć w artykule Jak używać wyrażeń regularnych w wyszukiwaniu plików .

Jeśli pracujesz z systemem Mac OS find , potrzebujesz nieco innego podejścia, jak wyjaśnił Motti Shneor w komentarzach:

find -E . -regex ".*\.([hmc]|mm|cp+|swift|pch)$" -exec wc -l {} +

Oba dadzą wynik w postaci:

234 ./file1
456 ./file2
690 total

Możesz więc zachować to w ten sposób lub po prostu potokować do tail -1(to znaczy find ... | tail -1), aby ostatnia linia była sumą.

fedorqui 'SO przestań szkodzić'
źródło
no cóż - find -regex ". * \. etc nie działa dla mnie na MacOS - twierdzi, że jest to nielegalna opcja --r jakiego rodzaju znaleziska używasz?
Motti Shneor
@MottiShneor prawdopodobnie chcesz sprawdzić to pytanie, o którym mówią \|i innych w MacOS. --regexdziała zarówno w GNU find (tym, którego używam), jak i MacOS.
fedorqui 'SO przestać szkodzić'
więc nie. Dowiedziałem się, że w MacOS musisz znaleźć -E dla rozszerzonych wyrażeń regularnych. Skopiuj sugerowane powyżej polecenie na dowolny OS-X, który możesz zdobyć, i przekonaj się sam. man find na MacOS-X mówi ci, że musisz -E do tego.
Motti Shneor
Na koniec musisz również podać ścieżkę wyszukiwania w systemie OSX. więc wariacja, która działa, wygląda następująco: find -E. -regex ". * \. ([hmc] | mm | cp + | swift | pch) $" -exec wc -l {} +
Motti Shneor
@MottiShneor dzięki za udostępnienie podejścia w systemie MacOS. Zaktualizowałem odpowiedź o to.
fedorqui 'SO przestań szkodzić'
2

Przepraszam, że powtarzam. To najłatwiejszy sposób IMHO:

  1. W typie terminala

find /users/<#username#>/documents/folderWithProject/ -type f -exec cp {} /users/<#username#>/documents/folderWithProject/newFolder/ \;

Spowoduje to skopiowanie wszystkich plików z folderu projektu do newFolder.

  1. Pobierz Xcode Statistician i używaj go znewFolder wprowadź opis obrazu tutaj
Nik Kov
źródło
To narzędzie nie znajduje wszystkiego, wygląda bardziej tak, jakby faktycznie wyglądało tylko w bieżącym folderze (nawet w podfolderach)
Daniel
Napisałem, że pierwszym krokiem jest skopiowanie wszystkich plików z folderu projektu do jednego folderu.
Nik Kov
Czy jest to przypadek open source „XcodeStatistican”? Sprawiłbym, że zadziałałoby w każdej strukturze projektu w mgnieniu oka ... Iteratory katalogów i plików nie są takie trudne. Ponadto - plik do pobrania stąd - nie jest podpisany przez zidentyfikowanego programistę - więc może to być złośliwe oprogramowanie: /
Motti Shneor
1

line-counterto dobra alternatywa. Jest lżejszy niż CLOC i znacznie mocniejszy i łatwiejszy w użyciu niż inne polecenia.

Szybki przegląd

W ten sposób otrzymujesz narzędzie

$ pip install line-counter

Użyj linepolecenia, aby uzyskać liczbę plików i liczbę linii w bieżącym katalogu (rekurencyjnie)

$ line
Search in /Users/Morgan/Documents/Example/
file count: 4
line count: 839

Jeśli chcesz uzyskać więcej szczegółów, po prostu użyj line -d.

$ line -d
Search in /Users/Morgan/Documents/Example/
Dir A/file C.c                                             72
Dir A/file D.py                                           268
file A.py                                                 467
file B.c                                                   32
file count: 4
line count: 839

A najlepszą częścią tego narzędzia jest to, że możesz dodać do niego plik .gitignore podobny do pliku konfiguracyjnego. Możesz skonfigurować reguły, aby wybierać lub ignorować rodzaje plików do zliczenia, tak jak w przypadku „.gitignore”. Tak, to narzędzie zostało wymyślone po to, aby łatwiej było wiedzieć, ile mam linii.

Więcej opisu i użytkowania można znaleźć tutaj: https://github.com/MorganZhang100/line-counter

Jestem autorem tego prostego narzędzia. Mam nadzieję, że to może komuś pomóc.

Morgan Zhang
źródło