2017-11-27 7 views
2

.bzlルール内から現在のディレクトリパス全体の値を取得しようとしています。私は、次の試してみました:

  1. ctx.host_configuration.default_shell_env.PATH戻り"/Users/[user_name]/.rbenv/shims:/usr/local/bin:/usr/bin:/bin:...

  2. ctx.bin_dir.path戻りbazel-out/local-fastbuild/bin

  3. pwd = ctx.expand_make_variables("cmd", "$$PWD", {})戻り列$PWD - 私はこのルールは私のために有用であるとは思わないが、ちょうどそれを使用してもよいです違う。

私が必要とするのは、Bazel .bzlルールを実行するcmdが実行されているディレクトリです。たとえば、/Users/[user_name]/git/workspace/path/to/bazel/rule.bzl、または少なくともWORKSPACEディレクトリの前のパスの最初の部分です。私はctx.actions.run_shell()

を呼び出す前に、私は、この値を保持Bazel構成には属性がありません。この値を必要とするので

私はpwdを使用することはできませんか?

答えて

1

目標はハーメチックビルドであるため、絶対パスに頼るべきではありません。

ctx.actions.run_shell()のコマンド内にpwdを自由に使用してください(再現可能なビルドについては、生成されたファイルに絶対パスを入れないように注意してください)。


編集。 技術的には、いくつかの回避策があります。たとえば、--defineフラグを経由してパスを渡すことができます:

bazel build :all --define=path=$(pwd) 

その後値がctx.var["path"]を使用して利用できるようになります。


以下のコメントに基づいて、パスに出力を宣言します。繰り返してみましょう:出力ファイルを宣言するために絶対パスを使うべきではありません。パッケージに出力を宣言します。次に、あなたがその出力を使用するために呼び出すツールを尋ねます。

たとえば、gccを呼び出す場合は、-oを使用して出力を指定できます。ツールがstdoutに書き込むときは、シェルを使ってそれをリダイレクトします。ツールが実際には柔軟でない場合は、独自のスクリプトでラップすることができます(ツールを呼び出して出力ファイルをコピーするなど)。

ここで絶対パスを使用するのは正しい解決策ではありません。たとえば、絶対パスが意味を持たないリモートマシン上でアクションを実行することが可能なはずです

ジップは合理的な解決策です。事前に番号または名前を知ることができない場合に便利です

+0

pythonの 'coverage'コマンドから出てくる出力ファイルを宣言するために' run_shell() 'を呼び出す前に' pwd'が必要でした(Coverage.pyユーティリティは、絶対値を使ってHTMLレポートのソースファイルに名前を付けます私はあなたの答えを受け入れることができますが、絶対パスを 'run_shellの外でbazel変数に入れてもらうことができない場合は、私はあなたの答えを受け入れることができます。 () 'を返します。 – Zeitgeist

+0

回避策を述べるために私のメッセージを編集しました。 – Laurent

+0

もう一度おねがいしますが、私の意図は絶対パスの場所で出力を宣言することではありませんでした。私が言っていることは、Coverage.pyツールは絶対パスをとり、 '/'で '/'を切り替えて、それを生成するhtmlファイルの名前として使用するということです。すべてがまだ気密であるので、出力ファイルの名前を知りたいだけです。 – Zeitgeist

関連する問題