打字稿“tsc”编译器挂在构建管道中

问题描述

我遇到了 tsc 编译在 buildkite 构建管道中无限期挂起的问题。

我找不到 tsc 的任何详细选项,所以我得到的最好的是 --traceResolution

在我的本地机器上,输出的最后几行是:

======== Type reference directive 'jest' was successfully resolved to '/Users/djohnston/git/myproject/node_modules/@types/jest/index.d.ts' with Package ID '@types/jest/index.d.ts@26.0.20',primary: true. ========
✨  Done in 6.35s.

在构建管道上,最后的命令是:

[2021-03-12T00:59:08Z] ======== Type reference directive 'jest' was successfully resolved to '/app/node_modules/@types/jest/index.d.ts' with Package ID '@types/jest/index.d.ts@26.0.20',primary: true. ========

所以看起来解析完全完成了。

还有什么可能导致 TypeScript 挂在这里?可能是 this question 所暗示的内存问题吗?

我可以添加一些进一步的命令/标志来帮助调试吗?

内存调查

构建代理是一个 AWS EC2 t2.large 实例 - 具有 8GB RAM。

我已将我的管道命令更新为:

top -bn1 &&  yarn test 

测试在哪里:

tsc --version && tsc --diagnostics && tsc  --traceResolution

我得到:

[2021-03-12T01:51:50Z] Mem: 3348592K used,4818096K free,504K shrd,1576K buff,2005316K cached
[2021-03-12T01:51:50Z] cpu:   0% usr   0% sys   0% nic 100% idle   0% io   0% irq   0% sirq
[2021-03-12T01:51:50Z] Load average: 1.49 0.47 0.17 2/280 279
[2021-03-12T01:51:50Z]   PID  PPID USER     STAT   VSZ %VSZ cpu %cpu COMMAND
[2021-03-12T01:51:50Z]   279     6 root     R     1580   0%   0   0% top -bn1
[2021-03-12T01:51:50Z]     6     1 root     S     1580   0%   1   0% /bin/sh -e -c .buildkite/scripts/prepare_npmrc.sh && yarn install && yarn bootstrap && yarn format:check && yarn lint && top -bn1 &&  yarn test && yarn build
[2021-03-12T01:51:50Z]     1     0 root     S     1052   0%   1   0% /sbin/docker-init -- docker-entrypoint.sh /bin/sh -e -c .buildkite/scripts/prepare_npmrc.sh && yarn install && yarn bootstrap && yarn format:check && yarn lint && top -bn1 &&  yarn test && yarn build

所以这似乎证实了我们确实有 8GB,尽管只有 4.8GB 可用。

第二部分:

[2021-03-12T01:54:23Z] $ tsc --version && tsc --diagnostics && tsc  --traceResolution
[2021-03-12T01:54:23Z] Version 4.2.3
[2021-03-12T01:54:23Z] Files:             1199
[2021-03-12T01:54:23Z] Lines:           194583
[2021-03-12T01:54:23Z] Nodes:           504127
[2021-03-12T01:54:23Z] Identifiers:     163089
[2021-03-12T01:54:23Z] Symbols:         201735
[2021-03-12T01:54:23Z] Types:            37565
[2021-03-12T01:54:23Z] Instantiations:  691770
[2021-03-12T01:54:23Z] Memory used:    256799K
[2021-03-12T01:54:23Z] I/O read:         0.13s
[2021-03-12T01:54:23Z] I/O write:        0.00s
[2021-03-12T01:54:23Z] Parse time:       5.04s
[2021-03-12T01:54:23Z] Bind time:        2.01s
[2021-03-12T01:54:23Z] Check time:       8.02s
[2021-03-12T01:54:23Z] Emit time:        0.00s
[2021-03-12T01:54:23Z] Total time:      15.07s

看起来只需要 250MB - 所以我看不出这是内存问题。

有什么建议吗?

更新 - 看起来它与 lerna/monorepos 有关。

这个项目的结构其实是这样的:

/
 package.json 
    test: "lerna run test"
    build: "lerna run build"
 packages/
   package-a 
      test: "tsc && jest" <- is failing here
   package-b
      test: "..." 
      build: "..."

所以在我运行“yarn test”的pipeline.yml中,它实际上运行的是“lerna run test”,它将运行那个单独的命令。

如果我将其更改为“cd packages/package-a && yarn test”,则它通过了。

这可能与这个 typescript issue 有关,他们提到 docker workdir 目录可能是问题所在。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)