将@author用作代码样式违规

ale*_*cxe 12 javascript jslint static-code-analysis jshint eslint

目标:

如果在项目中@author.js文件内的任何位置使用标记,则发出警告.

题:

jshint或其他静态代码检查工具可以帮助吗?如果没有,我有什么选择?

描述:

我完全同意Paul在Javadoc @author标签上的答案标记良好实践主题并将@author标签视为不必要的噪音.

而且,在Python世界中,我看到人们检查标签的使用情况.例如,Openstack Style Guidelines明确声明不使用@author标记.他们开发了一套自定义flake8检查,包括:

[H105] Don’t use author tags.
Run Code Online (Sandbox Code Playgroud)

现在,我正试图在JavaScript中解决同样的问题.

示例(这不应该通过代码质量检查):

/**
 * @author John Smith <john@smith.com>
 */

'use strict';
Run Code Online (Sandbox Code Playgroud)

小智 7

不,jshint不能那样做.只需要寻找@author的资源.如果你想要你可以把它放在一个git pre-commit钩子里.或者,如果遇到@author,你可以在创建文档时破解JSDoc错误输出.


ruf*_*fin 5

对不起,我打算在发布答案之前尝试一下,但赏金差不多了.; ^)

这个回答声称有一种方法可以编写自己的JSHint模块.

让我们假装它像宣传的那样工作,并且已经合并了.

这里有很好的指示,但请注意那些是在"jshint-next"网站上.

该页面的示例代码:

// 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.");
  });
}
Run Code Online (Sandbox Code Playgroud)

这是关于如何设置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();
Run Code Online (Sandbox Code Playgroud)

我意识到这是非常通用的(你仍然需要研究linter.on超越的选项Identifier; String例如也有),但它看起来非常有前景.同样,您可以看到如何使用上面的说明进行集成.它看起来像是使用style.js的格式.

还没试过这个.只是没有时间在家里; 道歉.

是否有一个特定的原因torazaburo的"Just grepit"答案不起作用?您是否需要将其作为代码质量工作流程的一部分?如果是这样,那么"编写自己的模块"似乎就是要走的路.

如果你愿意的话,还有很明显的方法来破解JSLint,但我不确定Crockford是否会欣赏它.; ^)


ale*_*cxe 5

使用ESLintpackage解决了该问题-一种可插入的linting实用程序,用于JavaScript。

创建了一个自定义规则(注意这很简单)并将其保存到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
    };
};
Run Code Online (Sandbox Code Playgroud)

现在,假设我有一个test.js文件违反了@author标签的使用:

/**
 * @author John Smith <john@smith.com>
 */
Run Code Online (Sandbox Code Playgroud)

并查看规则如何应用:

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

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

? 1 problem
Run Code Online (Sandbox Code Playgroud)

仅供参考,no-author: 2此处表示将规则作为错误打开(触发时退出代码为1)。