Bazel 与 lerna 和纱线工作区一起使用

jja*_*gga 3 node.js typescript bazel lerna bazel-rules

许多人正在使用 lerna 和/或纱线工作区。

\n\n

我想要么从它们迁移到 Bazel,要么只是将它们与 Bazel 一起使用,最好通过示例项目进行指导。

\n\n

例如,目前,我有一个这样的目录结构,其中 foo 是一个 Express 服务器,bar 是 foo 使用的库,两者都基于 typescript。

\n\n
<project root>\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 jest.config.js\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 lerna.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 packages\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bar\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 jest.config.js\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package.json\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 index.ts\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 unit\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 index.test.ts\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tsconfig.build.json\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tsconfig.json\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 foo\n\xe2\x94\x82       \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 jest.config.js\n\xe2\x94\x82       \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package.json\n\xe2\x94\x82       \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82       \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 hello.ts\n\xe2\x94\x82       \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 index.ts\n\xe2\x94\x82       \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test\n\xe2\x94\x82       \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 integration\n\xe2\x94\x82       \xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 index.test.ts\n\xe2\x94\x82       \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 unit\n\xe2\x94\x82       \xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 index.test.ts\n\xe2\x94\x82       \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tsconfig.build.json\n\xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tsconfig.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tsconfig.build.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tsconfig.json\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 yarn.lock\n
Run Code Online (Sandbox Code Playgroud)\n\n

我应该如何将它与 Bazel(如您所知)、WORKSPACE、BUILD 及其内容保持一致?

\n\n

有什么提示或例子吗?

\n\n

谢谢!

\n

Mat*_*kay 6

在rules_nodejs 示例目录中有一些与此有些类似的存储库结构示例。这表明(在本例中是 Angular 应用程序)具有共享库并使用它们,但这里的原理是相同的。

一般来说,项目的根目录中只有一个 WORKSPACE 文件。虽然不同的应用程序和库可以有多个package.json文件,但它会给ts_library规则增加一些额外的复杂性,对于入门来说,最好避免这种复杂性。此示例存储库显示了多个package.json文件,但没有 Typescript。

对于BUILD( 或BUILD.bazel) 文件,您至少需要一个 infoo和一个 in bar(以及根目录下的一个)。您拥有的 BUILD 文件越多,您为源代码划分的编译单元就越多,从而增加了增量。

然后ts_library向这些文件添加规则,可以在此处BUILD找到其文档,它们还显示了直接使用和. 然后,您可以定义 和 之间的源依赖关系,简单示例如下所示:tscts_libraryfoobar

packages/foo/BUILD:

ts_libaray(
  name = "foo",
  srcs = glob(["src/**/*.ts"]),
  deps = [
    "//packages/bar", <-- this is the source dep for bar
    "@npm//some-package",
  ],
)
Run Code Online (Sandbox Code Playgroud)

packages/bar/BUILD:

ts_libaray(
  name = "bar",
  srcs = glob(["src/**/*.ts"]),
  deps = [
    "@npm//some-other-package",
  ],
)
Run Code Online (Sandbox Code Playgroud)