【发布时间】:2018-11-28 12:48:54
【问题描述】:
我的项目结构中有多个子模块,这些子模块本质上也是属于它们自己的项目的文件夹。
对于给定的 python 项目,每个项目都有子项目。我希望能够编写一个宏来创建一组要对给定子项目执行的操作。
在 WORKSPACE 中基本上是这样的:
load("@io_bazel_rules_python//:python/pip.bzl",
"pip_import"
)
pip_import(
name = "foo",
requirements = "@subprojectname//:requirements.txt",
)
load("@foo//:requirements.bzl", "pip_install")
pip_install()
我想为多个子项目执行上述操作。但是,如果我将所有代码放入 bzl 文件中的函数中。
pyrules.bzl
load("@io_bazel_rules_python//:python/pip.bzl",
"pip_import"
)
def doit(name):
pip_import(
name = "foo",
requirements = "@{repo}//:requirements.txt".format(repo=name)
)
load("@foo//:requirements.bzl", "pip_install")
pip_install()
由于“'load' 处的语法错误:预期表达式”,我无法使用第二个加载命令。如果没有将多个 bzl 文件加载到父 WORKSPACE 中,还有其他方法可以创建可重用的逻辑块吗?
更新 1。 评论要求提供有关工作流程的更多信息。警告,对于 Bazel 似乎在其他地方(即不是 monorepo)的使用方式,我有一个非标准的布局。但它应该有类似的实际布局。
项目布局如下:
projectname/
WORKSPACE
BUILD
src/
stuff
submodule/ # < git modules that are checked out into folder
subproject1/
BUILD
src/
stuff
subproject2/
BUILD
src/
stuff
首先,我在 WORKSPACE 中加载了一个 repository_rule,它会在子模块文件夹中找到所有项目并将它们添加为存储库。在子项目中,其中一些是 python。我想加载它的 requirements.txt 文件。因此,这些 requirements.txt 文件在哪里以及对它们进行 pip 安装的总体问题。理想情况下,我希望子项目 BUILD 文件中的 py_library 定义知道子项目的需求文件存在依赖关系,但这可能无关紧要,因为父 BUILD 文件是唯一创建 par_binaries 等等的东西,所以只要 pip_install 和设置依赖项发生,项目本身应该是可用的。
Bazel 似乎不允许子项目像上面的 pip_install 那样定义自己的存储库操作。我认为这是因为您不能在 BUILD 文件中进行存储库操作,并且子 WORKSPACE 文件似乎没有任何效果。所以我最终不得不将它添加到父 WORKSPACE 文件中。
如果它在父 WORKSPACE 中,我必须复制粘贴我要使用的每个子项目的 pip 操作。但是,我更愿意设置一个通用规则来定位需求文件并 pip 安装它们。然而,试图从中创建一个宏意味着我不能在其中使用 load 调用。所有 pip 操作似乎都需要与存储库操作进行交互,然后只需要从父 WORKSPACE 文件中调用这些操作。
【问题讨论】:
-
您希望这个 pyrules.bzl 文件放在哪里?父 WORKSPACE 会引用它们吗?怎么样?
-
好点。我做了一个非常复杂的解决方法来动态创建 bzl 文件,然后将其添加为假存储库。这是我可以在启动时解决文件的唯一方法,而不必提前手动描述所有文件。
-
我认为如果你能提供更多关于你想到的流程的背景信息会有所帮助(假设在克隆之后)
标签: bazel