- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Bazel 中,给定构建目标,脚本(在 Bazel 之外运行)如何获取生成文件的路径?
场景:我使用 Bazel 进行构建,完成后,我想将结果复制到服务器。我只需要知道要复制哪些文件。我可以对文件列表进行硬编码,但我不想这样做。
一个简单的例子:这个 Bazel 脚本:
genrule(
name = "main",
srcs = ["main.in"],
outs = ["main.out"],
cmd = "cp $< $@",
)
main.in
的文件然后运行
bazel build :main
,巴泽尔报告:
INFO: Found 1 target...
Target //:main up-to-date:
bazel-genfiles/main.out
INFO: Elapsed time: 6.427s, Critical Path: 0.40s
bazel-genfiles/main.out
.但是我可以使用什么机器可读技术来获得该路径? (我可以解析
bazel build
的输出,但我们不鼓励这样做。)
bazel query --output=xml :main
, 转储有关
:main
的信息以 XML 格式。输出包括这一行:
<rule-output name="//:main.out"/>
name
是 Bazel 的标签格式;我不知道如何将其作为路径。
name
上做某种字符串替换字段,把它变成
bazel-genfiles/main.out
;但即使这样也不可靠。如果我的
genrule
已包含
output_to_bindir = 1
,那么输出将是
bazel-bin/main.out
反而。
<rule-output>
XML 输出中的字段。例如,如果我的
BUILD
文件有这个代码来制作一个 C 库:
cc_library(
name = "mylib",
srcs = glob(["*.c"])
)
bazel query --output=xml :mylib
的输出不包含
<rule-output>
或其他任何有用的东西:
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<query version="2">
<rule class="cc_library" location="/Users/mikemorearty/src/bazel/test1/BUILD:8:1" name="//:mylib">
<string name="name" value="mylib"/>
<list name="srcs">
<label value="//:foo.c"/>
</list>
<rule-input name="//:foo.c"/>
<rule-input name="//tools/defaults:crosstool"/>
<rule-input name="@bazel_tools//tools/cpp:stl"/>
</rule>
</query>
最佳答案
您可以使用 bazel aquery
获取此信息。查询
Action 图。
这是一个稍微丰富的示例,其中包含来自单个的两个输出文件
规则:
$ ls
BUILD main.in WORKSPACE
$ cat WORKSPACE
$ cat BUILD
genrule(
name = "main",
srcs = ["main.in"],
outs = ["main.o1", "main.o2"],
cmd = "cp $< $(location main.o1); cp $< $(location main.o2)",
)
$ cat main.in
hello
bazel aquery //:main --output=textproto
用机器可读的输出查询 Action 图(原型(prototype)是
analysis.ActionGraphContainer
):
$ bazel aquery //:main --output=textproto >aquery_result 2>/dev/null
$ cat aquery_result
artifacts {
id: "0"
exec_path: "main.in"
}
artifacts {
id: "1"
exec_path: "external/bazel_tools/tools/genrule/genrule-setup.sh"
}
artifacts {
id: "2"
exec_path: "bazel-out/k8-fastbuild/genfiles/main.o1"
}
artifacts {
id: "3"
exec_path: "bazel-out/k8-fastbuild/genfiles/main.o2"
}
actions {
target_id: "0"
action_key: "dd7fd759bbecce118a399c6ce7b0c4aa"
mnemonic: "Genrule"
configuration_id: "0"
arguments: "/bin/bash"
arguments: "-c"
arguments: "source external/bazel_tools/tools/genrule/genrule-setup.sh; cp main.in bazel-out/k8-fastbuild/genfiles/main.o1; cp main.in bazel-out/k8-fastbuild/genfiles/main.o2"
input_dep_set_ids: "0"
output_ids: "2"
output_ids: "3"
}
targets {
id: "0"
label: "//:main"
rule_class_id: "0"
}
dep_set_of_files {
id: "0"
direct_artifact_ids: "0"
direct_artifact_ids: "1"
}
configuration {
id: "0"
mnemonic: "k8-fastbuild"
platform_name: "k8"
}
rule_classes {
id: "0"
name: "genrule"
}
2
和 3
对应我们两个想要的artifacts
目标 ID 0
的条目与工件相关联2
和 3
;和 targets
ID 为 "0"
的条目与 //:main
相关联analysis.proto
的定义的方式或其
bazelbuild/bazel
存储库本身:
# Copyright 2019 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
r"""Parse an `aquery` result to list outputs created for a target.
Use this binary in conjunction with `bazel aquery` to determine the
paths on disk to output files of a target.
Example usage: first, query the action graph for the target that you
want to analyze:
bazel aquery //path/to:target --output=textproto >/tmp/aquery_result
Then, from the Bazel repository:
bazel run //tools/list_outputs -- \
--aquery_result /tmp/aquery_result \
--label //path/to:target \
;
This will print a list of zero or more output files emitted by the given
target, like:
bazel-out/k8-fastbuild/foo.genfile
bazel-out/k8-fastbuild/bar.genfile
If the provided label does not appear in the output graph, an error will
be raised.
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import sys
from absl import app
from absl import flags
from google.protobuf import text_format
from src.main.protobuf import analysis_pb2
flags.DEFINE_string(
"aquery_result",
None,
"Path to file containing result of `bazel aquery ... --output=textproto`.",
)
flags.DEFINE_string(
"label",
None,
"Label whose outputs to print.",
)
def die(message):
sys.stderr.write("fatal: %s\n" % (message,))
sys.exit(1)
def main(unused_argv):
if flags.FLAGS.aquery_result is None:
raise app.UsageError("Missing `--aquery_result` argument.")
if flags.FLAGS.label is None:
raise app.UsageError("Missing `--label` argument.")
if flags.FLAGS.aquery_result == "-":
aquery_result = sys.stdin.read()
else:
with open(flags.FLAGS.aquery_result) as infile:
aquery_result = infile.read()
label = flags.FLAGS.label
action_graph_container = analysis_pb2.ActionGraphContainer()
text_format.Merge(aquery_result, action_graph_container)
matching_targets = [
t for t in action_graph_container.targets
if t.label == label
]
if len(matching_targets) != 1:
die(
"expected exactly one target with label %r; found: %s"
% (label, sorted(t.label for t in matching_targets))
)
target = matching_targets[0]
all_artifact_ids = frozenset(
artifact_id
for action in action_graph_container.actions
if action.target_id == target.id
for artifact_id in action.output_ids
)
for artifact in action_graph_container.artifacts:
if artifact.id in all_artifact_ids:
print(artifact.exec_path)
if __name__ == "__main__":
app.run(main)
# Copyright 2019 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
package(default_visibility = ["//visibility:public"])
licenses(["notice"]) # Apache 2.0
filegroup(
name = "srcs",
srcs = glob(["**"]),
)
py_binary(
name = "list_outputs",
srcs = ["list_outputs.py"],
srcs_version = "PY2AND3",
deps = [
"//third_party/py/abseil",
"//src/main/protobuf:analysis_py_proto",
],
)
关于Bazel:你如何获得生成文件的路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47859615/
BufferedImage image = ImageIO.read(SpriteSheet.class.getResource(path)); BufferedImage image = Image
希望有人能够帮助我解决将我的 React 应用程序推送到 Heroku 时遇到的问题。 heroku 日志反复显示以下错误。 at=error code=H10 desc="App crashed"
我是 Kotlin 的新手,我正在经历这样的例子。 . . package com.example.lambda1 import spark.Spark.get fun main(args: Arra
如果您已经安装了 32 位 JDK,请在中定义一个 JAVA_HOME 变量 Computer>System Properties>System Setting>Enviorment VAriable
我正在开发一个独立于平台的应用程序。我收到一个文件 URL*。在 Windows 上,这些是: file:///Z:/folder%20to%20file/file.txt file://host/f
我在 OSX、Objective-C 上。 我有一个像 这样的路径/NSURL /Users/xxx/Desktop/image2.png 但我将它传递给第三方应用程序,该应用程序会像 excpect
我已经安装了 Android studio 和插件的 DART,FLUTTER 来启动 flutter,但是因为我在创建我的第一个 flutter 项目时无法提供 sdk 路径。 最佳答案 我试图找出
127.0.0.1:8000/api/仅包含来自第二个应用程序的 url,但我将两个 url 模块链接到相同的模式。甚至有可能做到这一点吗? 第一个应用程序: from django.urls imp
对于大量图像(大约 1k,加上相同数量的拇指,在大约 500 个文件夹中),我们要求网站上使用的所有图像 URI 都必须具有 SEO 优化路径。它们已经准备好并提供完整的路径结构(每个文件夹包含一个具
为什么 f 不是一个文件?什么可能导致这种情况? String currentPhotoPath = "file:/storage/sdcard0/Pictures/someFileName.
Gradle 中的项目名称或路径中允许使用哪些字符? 它是否与特定操作系统的目录名称中允许的字符相同(例如: http://en.wikipedia.org/wiki/Filename#Reserve
我有一个包含文件夹路径的表格。我需要找到层次结构中这些文件夹之间的所有“差距”。我的意思是,如果表格包含这 3 个文件夹: 'A' 'A\B\C' 'A\B\C\D\E\F\G' 我需要在层次结构中找
我在 Linux 服务器上的/home/subversion 中安装了 svn - 那里有一个 ROOT 文件夹,其中包含 db 和 conf 等文件夹。没有映射到项目名称的文件夹,请有人告诉我如何列
对于我的图像位置:/src/assets/bitmap/sample.jpg 给出了关键配置: context: resolve('src') output: { path: resolve('b
我需要创建带有圆角的 SVG 路径,以将它们导出到 DXF 进行切割。我的问题是角应该是圆弧,而不是贝塞尔曲线。 使用 arc 命令相对容易处理直角,因为半径也是从拐角到圆弧起点的距离。对于其他角度,
大家好,我正在玩 Airflow,我正在阅读这篇很有帮助的 tutorial .我正在寻求帮助以更好地了解 Admin->Connection 如何在 Conn Type: File (path) 方
我的目标是定义R将用于安装和搜索库的单个路径。我read可以通过更改Rprofile.site安装路径中的R文件来完成。我在那里尝试了两个命令: .libPaths("D:/RLibrary") .L
我有一个问题:当我在一个页面中时,我想返回到上一页。我使用 $routeProvider。如何读取之前的 url? 我尝试在我的 Controller 中使用此代码但不起作用... angular.m
我正在尝试将一个文件从我的主干合并到一个分支(wc),并且对于看起来位于当前合并操作中不涉及的分支上的路径出现奇怪的未找到路径错误。 例如,在我们的 svn 项目中,我们有: 分行 分支 0 分支 1
我有一个树数据序列化如下: 关系:P到C是“一对多”,C到P是“一对一”。所以列 P 可能有重复的值,但列 C 有唯一的值。 P, C 1, 2 1, 3 3, 4 2, 5 4, 6 # in da
我是一名优秀的程序员,十分优秀!