2017-11-15 3 views
1

私はvimをエディタとシンタックスプラグインとして使用しています。私は、Bazelのようなツールでpylintを使う慣用的な方法を理解しようとしています。bazelでpylintを設定する最も良い方法

pylintには、sys.hookを動的に操作するために使用できるinit-hookコマンドラインパラメータがあります。私はこれを行うためのラッパースクリプトを書くことを考えていましたが、私は "init-hook"コマンドとして渡すべき正しいものを決める方法が不明です。

+0

私はBazelとPyLintの間の接続、または達成しようとしていることはありません。あなたはそれらの相互作用をどのように想像していますか? –

+0

@László恐らく、パイリントは、他の種類のテストと同様に、バゼルを介して走るようにしています。 – Alec

答えて

0

私が知っている最良の方法は、試験の一部としてpylintを実行することです。

理想的には、ファイルごとにlintingルールを設定すると、そのファイルが変更されたときにそのファイルを再度リントすることができます。しかしこれはおそらく実用的ではありません。

スケールの反対側には、プロジェクト内のすべてのファイルをlintするルールが1つあります。このルールは、1つのファイルだけが変更された場合でもすべてのファイルを元に戻します。これは非効率的です。

私の意見では、良い中間地は、Bazelパッケージごとに1つの糸くず処理ルールです。

sh_test(
    name = "lint_test", 
    srcs = ["lint_test.sh"],  # this doesn't have to do anything 
    data = ["lint_files.out"], 
) 

genrule(
    name = "lint_files", 
    srcs = glob(["**/*.py"]), 
    outs = ["lint_files.out"], 
    tools = ["@local_pylint_config//:pylint"], 
    cmd = "$(location @local_pylint_config//:pylint) $(SRCS) >&/dev/null && md5sum $$(echo $(SRCS) | sort) > [email protected]", 
) 

注:

  • テストに合格した場合は、その依存関係「lint_files」することができます

    、私は次のパターンをお勧めしますが、例えば@local_pylint_config//:pylint下のワークスペース内のバイナリとしてpylintていると仮定すると、 lintingが成功すれば成功する。したがって、lintingが成功した場合にのみ、テストは成功します。

  • "pylint"ルールが適切な設定用に構築されていることを確認するために、genruleを使用しています。
  • ビルドノイズを減らすために、pylintの出力を/dev/nullにリダイレクトしています。
  • 私はすべてのソースのチェックサムを計算して、出力ファイルに書き出します。ソースの内容だけに依存する一意の出力を書き出します(現時点ではそうではありません)。私は出力が確定的であることを保証するためにソースファイルをソートしています。 md5sumの代わりに出力ファイルを単にtouchにすると、出力の内容はソースの内容とは無関係になるため、下流のテストルールは再実行されません。
  • しかし、ソースファイルのチェックサムの代わりに... && date > [email protected]を使用すると、Bazelは元のファイルが変更された場合にgenelleを再構築してソースファイルを再作成するため、現在の時刻が変更されていました。しかし、チェックサムの使用は決定論的です。
関連する問題