0

私はgrunt-closure-linter npm プロジェクトを改善しようとしています (実際に生産的な方法で使用できるようにするため)。

gjslintClosure Linter のドライバーであるコマンド ラインにオプションを渡す方法を指定したいと考えています。

USAGE: /usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/bin/gjslint [flags]

flags:

closure_linter.checker:
  --closurized_namespaces: Namespace prefixes, used for testing ofgoog.provide/require
    (default: '')
    (a comma separated list)
  --ignored_extra_namespaces: Fully qualified namespaces that should be not be reported as extra
    by the linter.
    (default: '')
    (a comma separated list)

closure_linter.common.simplefileflags:
  -e,--exclude_directories: Exclude the specified directories (only applicable along with -r or
    --presubmit)
    (default: '_demos')
    (a comma separated list)
  -x,--exclude_files: Exclude the specified files
    (default: 'deps.js')
    (a comma separated list)
  -r,--recurse: Recurse in to the subdirectories of the given path;
    repeat this option to specify a list of values

closure_linter.ecmalintrules:
  --custom_jsdoc_tags: Extra jsdoc tags to allow
    (default: '')
    (a comma separated list)

closure_linter.error_check:
  --jslint_error: List of specific lint errors to check. Here is a list of accepted values:
    - all: enables all following errors.
    - blank_lines_at_top_level: validatesnum
...

ご覧のとおり、これには多くのオプションがあります。

単調なタスクは非常に簡潔なので、これを実行するためにコマンドラインに挿入する場所をすぐに見つけることができましたが、次のような健全な JSON 表現を変換するにはどうすればよいか疑問に思っています。

{
    "max_line_length": '120',
    "summary": true
}

コマンドラインオプション文字列に:

--max_line_length 120 --summary

それを JSON で表現する標準的な方法があるかどうかさえ明らかではありません。value を使用して単純な no-param 引数を指定することは、他の誰かが正気であるとは考えないかもしれないということが私には起こりましたtrue

より明確だが構造化されていない方法にフォールバックできると思います

[ "--max_line_length", "120", "--summary" ]

コンマや引用符を避けて単純な文字列のままにしておきたいと思うことを考えると、それはほとんど実用的ではありません。

これはどのように定義されるべきですか?

4

1 に答える 1

0

オプションのオブジェクトをコマンドライン引数の配列に変換するモジュールdargsをユースケースに適合させました。

キャメルケースのキーを持つオブジェクトを渡すだけで、あとは自動で処理されます。

function toArgs(options) {
    var args = [];

    Object.keys(options).forEach(function (key) {
        var flag;
        var val = options[key];

        flag = key.replace(/[A-Z]/g, '_$&').toLowerCase();

        if (val === true) {
            args.push('--' + flag);
        }

        if (typeof val === 'string') {
            args.push('--' + flag, val);
        }

        if (typeof val === 'number' && isNaN(val) === false) {
            args.push('--' + flag, '' + val);
        }

        if (Array.isArray(val)) {
            val.forEach(function (arrVal) {
                args.push('--' + flag, arrVal);
            });
        }
    });

    return args;
};

例:

toArgs({ maxLineLength: 120 });

出力:

['--max_line_length', '120']
于 2013-08-12T07:43:18.980 に答える