【问题标题】:Is there any way to include a file with a bang (!) in the path in a genrule?有没有办法在 genrule 的路径中包含一个带有 bang (!) 的文件?
【发布时间】:2017-05-03 23:30:09
【问题描述】:

我有一个 iOS 框架,它依赖于(可能是 Google 维护的)名为“!ProtoCompiler”的 pod。为了构建我的框架,我需要在沙箱中使用它。所以,我有一个 genrule,可以尝试将它包含在

src = glob(['Pods/!ProtoCompiler/**/*']) 但我收到以下错误:

错误:BUILD:2:1://Foo:framework-debug:'genrule'规则中属性'srcs'的元素1118中的标签'Pods/!ProtoCompiler/google/protobuf/any.proto'无效:无效目标名称“Pods/!ProtoCompiler/google/protobuf/any.proto”:目标名称可能不包含“!”。

就目前而言,这对我使用 bazel 进行此构建来说似乎是一个完全的障碍。据我所知,我无法重命名 pod 目录。据我所知,!禁止应该针对 target 标签,有什么方法可以指定这只是一个文件,而不是标签?还是这两个概念完全融合在了bazel中?

(另外,如果我让它工作,我担心这会产生一个 .framework 目录,而且似乎规则只产生文件。也许我会把它压缩然后解压缩为测试工具构建的一部分。)

【问题讨论】:

  • 谢天谢地,在构建时不需要这些 pod,所以我想我躲过了这颗子弹。不过,我仍然很想知道是否有答案。将 bazel 包/目标规则应用于项目中的所有文件路径似乎是错误的。

标签: bazel


【解决方案1】:

据我所知,!禁止应该是针对目标的 标签,有什么办法可以指定这只是一个文件,而不是 标签?还是这两个概念完全融合在了bazel中?

它们大多是模制的。

Bazel 将标签与出现在 BUILD 文件中的包中的所有源文件相关联,这样您就可以在构建规则中编写 srcs=["foo.cc", "//bar:baz.cc"] 并且无论 foo.ccbaz.cc 是源文件,它都可以工作、生成的文件或生成适合此特定 srcs 属性的文件的构建规则的名称。

也就是说,您当然可以在包中包含任何文件,但如果名称不允许 Bazel 从中派生标签,则您无法在 BUILD 文件中引用它们。由于glob 在加载过程中被评估并扩展为标签列表,因此使用glob 将无法解决此限制。

(...) 似乎规则只生成文件。也许 我会将其压缩,然后将其作为测试构建的一部分解压缩 线束。

是的,这是通常的方法。

【讨论】:

  • “您可以在包中包含任何文件”是指包含 BUILD 文件的目录可以包含您喜欢的任何名称的文件吗?我很欣赏这不会使 bazel 崩溃,但为了在 bazel 构建中执行 any 操作,您必须在某处实际引用 BUILD 文件中的文件,不是吗?
  • 您在这两个帐户上都是对的。是的,这就是我的意思——仅仅在包中包含 Bazel 无法使用的文件不会使 Bazel 崩溃或使其无法运行,这是非常基本的,但我还是想指出这一点。唉,要使这些文件有用,您确实需要以某种方式引用它们。
猜你喜欢
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多