14

目标:

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

问题:

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

描述:

我完全同意 Paul 在Javadoc @author tag good practice thread 上的回答,并将@authortag 视为不必要的噪音。

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

[H105] Don’t use author tags.

现在,我正在尝试在 JavaScript 中解决同样的问题。

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

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

'use strict';
4

3 回答 3

8

不,jshint 不能那样做。只需对寻找@author 的来源进行 grep 操作。如果你愿意,你可以把它放在一个 git pre-commit 钩子中。或者,如果遇到@author,您可以破解 JSDoc 在创建文档时出错。

于 2014-12-04T04:22:43.947 回答
6

ESLint用package解决了这个问题——一个用于 JavaScript 的可插入 linting 实用程序。

创建了一个自定义规则(注意它是多么简单)并将其保存到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
    };
};

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

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

并查看如何应用规则:

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

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

✖ 1 problem

仅供参考,no-author: 2这里的意思是将规则作为错误打开(触发时退出代码为 1)。

于 2014-12-26T23:49:54.837 回答
6

抱歉,我打算在发布答案之前先尝试一下,但赏金快到了。;^)

这个答案声称有一种方法可以编写自己的 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.");
  });
}

以下是关于如何设置 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();

我意识到这是非常通用的(您仍然需要研究linter.on其他选项Identifier;例如,还有一个String),但它看起来很有希望。同样,您可以了解如何使用上述说明进行集成。看起来这style.js.

我还没有尝试过。只是没时间在家;道歉。

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

如果你愿意的话,也有很明显的方法可以破解 JSLint,但我不确定 Crockford 会不会欣赏。;^)

于 2014-12-18T15:54:02.363 回答