我遇到了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 挂在这里?这可能是这个问题可能暗示的记忆问题吗?
我可以添加一些进一步的命令/标志来帮助调试吗?
内存调查
构建代理是一个 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”,则它通过了。
这可能与这个打字稿问题有关,他们提到 docker workdir 目录可能是问题所在。