2017-11-09 1 views
0

私は最初のカスタムBazelルールに取り組んでいます。このルールでは、batsコマンドラインテストを実行できます。Bazel実行パスの慣用的な検索

私は、以下にルール定義を逐語的に含めました。私はそれまでにはかなり満足していますが、実際には醜いと非標準的な感じの部分があります。ルールユーザーがルールにバイナリ依存関係を追加すると、バイナリがテストされるようにPATHに表示されていることを確認します。現時点で私は、バイナリパスのリストを作成して、$PWDでそれらを追加し、スクリプト内で完全な実行パスに展開します。これはハッキーとエラーを起こしやすいと感じています。

もっと慣れた方法がありますか?実行フェーズまで作成されていないため、ルールの実行パスにアクセスできるとは思えません。

ありがとうございました!

BATS_REPOSITORY_BUILD_FILE = """ 
package(default_visibility = [ "//visibility:public" ]) 
sh_binary(
    name = "bats", 
    srcs = ["libexec/bats"], 
    data = [ 
    "libexec/bats-exec-suite", 
    "libexec/bats-exec-test", 
    "libexec/bats-format-tap-stream", 
    "libexec/bats-preprocess", 
    ], 
) 
""" 

def bats_repositories(version="v0.4.0"): 
    native.new_git_repository(
     name = "bats", 
     remote = "https://github.com/sstephenson/bats", 
     tag = version, 
     build_file_content = BATS_REPOSITORY_BUILD_FILE 
    ) 

BASH_TEMPLATE = """ 
#!/usr/bin/env bash 
set -e 
export TMPDIR="$TEST_TMPDIR" 
export PATH="{bats_bins_path}":$PATH 
"{bats}" "{test_paths}" 
""" 

def _dirname(path): 
    prefix, _, _ = path.rpartition("/") 
    return prefix.rstrip("/") 

def _bats_test_impl(ctx): 
    runfiles = ctx.runfiles(
     files = ctx.files.srcs, 
     collect_data = True, 
) 

    tests = [f.short_path for f in ctx.files.srcs] 
    path = ["$PWD/" + _dirname(b.short_path) for b in ctx.files.deps] 

    sep = ctx.configuration.host_path_separator 

    ctx.file_action(
     output = ctx.outputs.executable, 
     executable = True, 
     content = BASH_TEMPLATE.format(
      bats = ctx.executable._bats.short_path, 
      test_paths = " ".join(tests), 
      bats_bins_path = sep.join(path), 
    ), 
) 

    runfiles = runfiles.merge(ctx.attr._bats.default_runfiles) 

    return DefaultInfo(
     runfiles = runfiles, 
) 

bats_test = rule(
    attrs = { 
     "srcs": attr.label_list(
      allow_files = True, 
     ), 
     "deps": attr.label_list(), 
     "_bats": attr.label(
      default = Label("@bats//:bats"), 
      executable = True, 
      cfg = "host", 
     ), 
    }, 
    test = True, 
    implementation = _bats_test_impl, 
) 
+0

私の答えは、あなたが受け入れ答えとしてそれをマークしてくださいすることができます助けましたか? – Ittai

+0

あなたの答えは良いです!私は自分のプラットフォーム上で利用できるように0.8.0を待っているので、私が受け入れる前に自分で変更を実装することができます。遅延のお詫び – xoebus

+0

確かです。 Windowsを待っていますか?他のプラットフォームがリリースされました – Ittai

答えて

2

これは〜2週間でリリースされるBazel 0.8.0からサポートするのは簡単です。
skylarkの実装ではctx.expand_location(binary)を入力してください。binary$(execpath :some-label)のようになりますので、ユーザから受け取ったラベルのフォーマットを$(execpath)にして、bazelがそのラベルの実行場所を指定するようにしてください。

いくつかの関連するリソース: $location expansion in Bazel
https://github.com/bazelbuild/bazel/issues/2475 https://github.com/bazelbuild/bazel/commit/cff0dc94f6a8e16492adf54c88d0b26abe903d4c

+0

ありがとう!私はそれを試してみました。それは 'bazel-out/darwin-fastbuild/bin/path/to/binary'のようなものです。これを '$ PATH'に入れるためには絶対パスである必要があると思いますが、実行フェーズまでパス全体が利用可能かどうかはわかりません。私は別の方法論を持っているべきですか?例えば'PATH'を変更するのではなく、相対パスをテストツールに渡しますか? – xoebus

+0

より良いかもしれない相対パスを渡すことができれば。ディレクトリの実際の接頭辞をどのように取得できるかはわかりません。ごめんなさい。 – Ittai

+0

心配はいりません。 PATHの変更はいつもちょっとスケッチと感じました。 – xoebus

関連する問題