2014-12-03 28 views
12

Cel:Treat użycie @author jako naruszenie stylu kod

upomnienia w przypadku znacznik @author jest stosowany wszędzie wewnątrz .js plików w projekcie.

Pytanie:

Czy jest coś, co jshint lub inne statyczne Narzędzia Sprawdzanie kodu może pomóc? Jeśli nie, jakie mam opcje?

Opis:

Całkowicie zgadzam się z odpowiedzią Pawła na Javadoc @author tag good practices wątku i traktować @author tag jako niepotrzebnego hałasu.

W świecie Python widziałem ludzi sprawdzających użycie tagu. Na przykład: Openstack Style Guidelines jawnie nie używaj tagu @author. Oni opracowali zestaw niestandardowych flake8 kontrole, które obejmują:

[H105] Don’t use author tags. 

Teraz staram się rozwiązać ten sam problem w JavaScript.

Przykład (nie powinno to przejść kontrolę jakości kodu):

/** 
* @author John Smith <[email protected]> 
*/ 

'use strict'; 
+1

Nie, jshint nie może tego zrobić. Po prostu zrób grep w poprzek źródeł szukających "@ author". Jeśli chcesz, możesz umieścić to w haku git przed popełnieniem błędu. Możesz też zhackować JSDoc, aby pomyłki podczas tworzenia dokumentów, jeśli napotka "@ author". –

+0

@torazaburo dziękuję za użyteczny komentarz, może to być prawdziwa odpowiedź. – alecxe

Odpowiedz

7

Nie, jshint nie może tego zrobić. Po prostu zrób grep w poprzek źródeł szukających @author. Jeśli chcesz, możesz umieścić to w haku git przed popełnieniem błędu. Możesz też zhackować JSDoc, aby pomyłkowo tworzyć dokumenty, jeśli napotka @author.

5

Przepraszam, chciałem to wypróbować przed wysłaniem odpowiedzi, ale nagroda jest prawie za wysoka. ; ^)

This answer twierdzi, że istnieje sposób na napisanie własnego modułu JSHint.

Udawajmy działa jak reklamowane i została połączona widok.

Great instructions here, jednak pamiętać, że są to na „jshint-next” miejscu.

Przykład kodu z tej strony:

// This module errs on any identifier that doesn't starts with 'kitty'. 
function myModule(linter) { 
    linter.on("Identifier", function (ident) { 
    if (ident.name && ident.name.slice(0, 5) !== "kitty") 
     linter.report.addError("C001", "More cats please."); 
    }); 
} 

Oto z początkowego odcinka, w jaki sposób skonfigurować LINTER:

var Linter = require("jshint").Linter; 
var code = "<your beautiful JavaScript code here>"; 

// Create a new instance of Linter. 
var linter = new Linter(code); 

// Now you can teach JSHint about your predefined variables. 
// Note that default JavaScript identifiers are already there. 
linter.addGlobals({ 
    jQuery: false, 
    MyPlugin: true 
}); 

// If you have any JSHint extensions, you can attach them 
// to the current instance. 
linter.addModule(myModule); 

// Finally, parse your code. 
linter.parse(); 

Zdaję sobie sprawę, że to dość rodzajowe (trzeba by jeszcze trzeba badań linter.on opcji poza Identifier; jest też String, ale), ale wygląda całkiem obiecująco.Ponownie można zobaczyć, jak zintegrować, korzystając z instrukcji: above. Wygląda na to, że jest to format: used in style.js.

Mam nie wypróbowałem tego jeszcze. Po prostu nie miałem czasu w domu; przeprosiny.

Czy istnieje szczególny powód, że odpowiedź Torazaburo "Tylko grep to" nie działa? Czy potrzebujesz tego, aby być częścią przepływu pracy o jakości kodu? Jeśli tak, to "napisz swój własny moduł" wydaje się być drogą do zrobienia.

Są też dość oczywiste sposoby na hackowanie JSLinta, jeśli masz na to ochotę, ale nie jestem pewien, czy Crockford to doceni. ; ^)

+0

Ha, oczywiście nagroda przyznawana jest * jako * Piszę tę odpowiedź. Tak otrzymuję. – ruffin

+0

:) Nie przejmuj się tym - wypróbuję to i skontaktuję się z Tobą. Dziękuję Ci bardzo. (z przegranych na dzisiaj, ale to zdecydowanie zasługuje na jedno) – alecxe

+0

FYI, napisałem, jak rozwiązałem go za pomocą 'ESLint' (zauważ prostotę). Bounty i tak do ciebie idzie. Dziękuję za rozpatrzenie tego. – alecxe

4

Rozwiązał to za pomocą ESLint package - wtykowego narzędzia do przewijania dla JavaScript.

Utworzony custom rule (uwaga jakie to proste) i zapisaniu go do rules/no-author.js:

/** 
* @fileoverview A rule to disallow @author tag in code 
*/ 

module.exports = function (context) { 
    "use strict"; 
    function checkComment(node) { 
     var commentToCheck = node.value.toLowerCase().trim(); 

     if (commentToCheck.indexOf("@author") !== -1) { 
      context.report(node, "A comment unexpectedly contains @author."); 
     } 
    } 

    return { 
     "BlockComment": checkComment, 
     "LineComment": checkComment 
    }; 
}; 

Teraz wyobrazić Mam plik test.js które naruszają użycie @author tag:

/** 
* @author John Smith <[email protected]> 
*/ 

Zobacz, jak zastosowana jest reguła:

$ eslint test.js --rulesdir=rules/ --rule='no-author: 2' 

test.js 
    1:0 error A comment unexpectedly contains @author no-author 

✖ 1 problem 

FYI,tutaj means, aby włączyć regułę jako błąd (kod wyjścia wynosi 1 po uruchomieniu).