标签: bazel-rules-nodejs

当我使用 Bazel Test 时,Nest 无法解析 RootTestModule 上下文中的依赖关系

我需要在挡板中运行我的测试。我该如何解决这个神秘的问题?

我有一个 nestjs 项目,其中包含多个应用程序和库。当我运行测试时yarn jest --config ./jest.config.json libs/lib1,它运行良好。但是,当我使用 bezel 运行时,bazel test //libs/lib1/...它给了我一个错误“Nest 无法解析依赖项...请确保索引处的参数依赖项...在 RootTestModule 上下文中可用。”。

回购协议

https://github.com/smhmayboudi/bazel_jest_nestjs
Run Code Online (Sandbox Code Playgroud)

我发现 jest.config.json 中的映射顺序很重要。这个效果很好(显示测试+覆盖),但依赖性问题

  "moduleNameMapper": {
    "@melo/lib1": "<rootDir>/libs/lib1/src",
    "@melo/lib1/(.*)": "<rootDir>/libs/lib1/src/$1",
  },
Run Code Online (Sandbox Code Playgroud)

这个有效(仅显示传递消息而没有实际测试结果和覆盖率!?)

  "moduleNameMapper": {
    "@melo/lib1/(.*)": "<rootDir>/libs/lib1/src/$1",
    "@melo/lib1": "<rootDir>/libs/lib1/src",
  },
Run Code Online (Sandbox Code Playgroud)

玩笑配置

{
  "coverageReporters": ["lcov", "text-summary"],
  "moduleNameMapper": {
    "@melo/libs1": "<rootDir>/libs/libs1/src",
    "@melo/libs1/(.*)": "<rootDir>/libs/libs1/src/$1",
  },
  "modulePathIgnorePatterns": ["/bazel-out/", "/node_modules/"],
  "preset": "ts-jest",
  "testEnvironment": "node"
}
Run Code Online (Sandbox Code Playgroud)

巴泽尔配置

ts_library(
    name = "lib1_test_ts_library",
    srcs = glob(["*spec.ts"]),
    runtime = "nodejs",
    deps = [
        ":lib1_ts_library",
        "@npm//@nestjs/common",
        "@npm//@nestjs/testing",
        "@npm//@types/jest",
        "@npm//rxjs",
        "@npm//ts-jest",
    ], …
Run Code Online (Sandbox Code Playgroud)

jestjs bazel ts-jest bazel-rules-nodejs

8
推荐指数
2
解决办法
4222
查看次数

Bazel:使用另一个链接的 JS 依赖项构建 js_library(yarn 工作区)

我有一个项目,其中包含多个 JS 包并使用 Yarn 工作区进行组织:

\n
<root>\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 WORKSPACE\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 workspaces\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foo\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 BUILD.bazel\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n    \xe2\x94\x82\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bar\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 BUILD.bazel\n    \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\n
Run Code Online (Sandbox Code Playgroud)\n

FOO包依赖于BAR包,它的定义在FOO/package.json

\n
<root>\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 WORKSPACE\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 workspaces\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foo\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 BUILD.bazel\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n    \xe2\x94\x82\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bar\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 BUILD.bazel\n    \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\n
Run Code Online (Sandbox Code Playgroud)\n

workspaces/bar/BUILD.bazel看起来像这样

\n
workspaces/foo/package.json\n\n{\n  "name": "FOO",\n  "dependencies": {\n     "BAR": "link:../bar",\n  }\n …
Run Code Online (Sandbox Code Playgroud)

bazel bazel-rules-nodejs

6
推荐指数
1
解决办法
620
查看次数

执行从 bazel 规则作为参数传递的打字稿文件

我正在 js 中为 mono 仓库编写 bazel 规则。这背后的想法是 Mono 存储库(微服务)内的服务在开放的 api 模式文件中定义 api 规范。在我们的例子中,这些模式位于 ts 文件中,因为当每个路由和最终规范文件导入每个路由模式并集成到最终对象时,规范被破坏。

我想在集中位置编写 bazel 规则,以便每个项目都可以加载该规则并使用其架构文件调用它

generate_yaml_from_ts(
    name = 'generate_yaml',
    schema = "src/api/routes/openapi.schema.ts"
)
Run Code Online (Sandbox Code Playgroud)

我不确定是否所有模式文件( openapi.schema.ts 导入其他 ts 文件)都需要可供规则使用。

在规则中,我有一个 ts 代码,我想在其中引用传递的模式文件并生成yaml文件。(如下所示,我知道静态导入不起作用)

import fs from 'fs';

import YAML from 'yaml';

import openapiJson from './src/api/routes/openapi.schema';

fs.writeFileSync(process.argv[2], YAML.stringify(openapiJson));
Run Code Online (Sandbox Code Playgroud)

我创建了一个节点可执行文件以从代码运行ts-node,但问题是我们提供的输入也是ts文件,因此需要首先编译。

我可以想到两种可能的方法来解决这个问题,但我不确定到底该怎么做。

  1. ts在从服务传递到规则之前编译架构。(使用 ats_library并将输出传递给规则?)
  2. 在规则中创建 ts 可执行文件(ts-node在 bzl 文件中使用),传递源文件连接generateYml.ts和传递的模式文件。

github上提供了带有 bazel 设置的简单项目

我编写了一条规则,从项目中获取 json 文件并生成build/rules/json2yaml有效的 yaml。 …

bazel bazel-rules bazel-rules-nodejs

5
推荐指数
1
解决办法
394
查看次数

如何使用可单独部署的包制作 Bazel TypeScript monorepo

我一直在尝试让 bazel monorepo 与打字稿一起工作。我有几个要求。

  1. 我应该能够使用 @myworkspace/ 而不是 ../../../ 等导入本地包,而不需要 Bazel。这主要是为了让我在写作时能够自动完成。
  2. @myworkspace/ 包在开发和构建期间应该是相同的,但在运行沙箱时,只有 Bazel 管理的依赖项应该在导入时得到解析。只是为了让我知道我是否弄乱了 js_library 规则中的包名称。
  3. 整个项目应该只有一个锁定文件。所有依赖项应位于 root/node_modules 中。
  4. 应该可以单独部署节点包,即@myworkspace/myCloudFunction。
  5. 应该可以在将部署的包中包含本地依赖项。

我是 Bazel 的新手,来自 NPM 生态系统的我似乎需要一些心态上的改变。经过谷歌搜索后,我设法找到了适用于第 1 点和第 2 点的东西(但我可能是错的)。我已经在https://github.com/vitorelourenco/bazelmono-ts上发布了游乐场存储库(几乎是来自https://github.com/lokshunhung/bazel-ts-monorepo 的副本,其中包含我从 https://github.com/lokshunhung/bazel-ts-monorepo 获取的一些想法: //github.com/Angular/Angular

我关于第 3 点和第 4 点的问题:假设我希望在包 @myworkspace/cloudFunction 上提供 lib Lodash,并将其部署到 Google Cloud Functions。如果我在 @myworkspace/cloudFunction 文件夹中安装 Lodash,那么 Lodash 将被添加到 package.json 中,但我将拥有第二个 node_modules 文件夹和第二个 yarn.lock 文件,我不希望这样。但如果我将其安装在 root/ 中,那么 Lodash 将不会添加到位于 @myworkspace/cloudFunction 的 package.json 上列出的依赖项中,并且当我部署它时,它也不会安装。有聪明的方法来处理这个问题吗?

第5点非常相似。理想情况下,最终的 Bazel 输出将捆绑本地依赖项并准备使用,但我似乎还无法找到一种方法来做到这一点。我尝试将 pkg_npm 规则添加到 playgroup 存储库中的 //packages/app 中,但无法使其包含 …

bazel bazel-rules-nodejs

5
推荐指数
0
解决办法
511
查看次数

标签 统计

bazel ×4

bazel-rules-nodejs ×4

bazel-rules ×1

jestjs ×1

ts-jest ×1