如何在 CodeBuild/Ubuntu (TS2307) 中使用 tsc 解析相对路径?
How to resolve relative paths with tsc in CodeBuild/Ubuntu (TS2307)?
我无法在 AWS CodeBuild(Ubuntu 图像)中转换我的打字稿文件,TS2307 错误无法解析我自己的文件。
当然,我在本地尝试了完全相同的项目。调用 tsc
,它正在读取项目目录根目录中的 tsconfig.json 文件。然后我会 运行 node ./dist/index.js
使用节点执行应用程序(而不是 ts-node ./src/index.ts
)。有效(REST 服务提供 json 数据)。
在 AWS CodeBuild 中,tsc
失败。
这些是我的代码行,相对无法解析。在有绝对导入(例如 import * as express from 'express'
)之前都可以正常工作。
有人知道为什么在 AWS CodeBuild 中没有 resolve/transpile 尽管它是相同的项目文件(都是在从 github 拉取之后)?我缺少什么标志?
我在本地使用 Windows。并且 Ubuntu 在 CodeBuild 中。
import { TermEndpoints } from './endpoints/termEndpoints'
import { TranslationEndpoints } from './endpoints/translationEndpoints'
import { LanguageEndpoints } from './endpoints/LanguageEndpoints'
import { NavLangEndpoints} from './endpoints/navLangEndpoints'
import { InfoEndpoint } from './endpoints/infoEndpoint'
我的 tsconfig.json 文件是
{
"compilerOptions": {
"baseUrl": "./src/",
"outDir": "./dist",
"allowJs": true,
"target": "es2017",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": false,
"strict": false,
"declaration": true,
"experimentalDecorators": true,
"importHelpers": true,
"esModuleInterop": false,
"resolveJsonModule": true,
"removeComments": true,
"types": ["node"],
"typeRoots": [
"node_modules/@types"
],
"lib": [ "es2017", "dom" ]
},
"include": [
"./src/**/*"
]
}
Code Build 的日志文件
[Container] 2020/05/11 10:06:10 Running command npm install typescript
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@2.1.2 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.1.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
+ typescript@3.8.3
updated 1 package and audited 655 packages in 2.484s
found 0 vulnerabilities
[Container] 2020/05/11 10:06:13 Running command tsc --version
Version 3.8.3
[Container] 2020/05/11 10:06:13 Running command npm run build:acc
> sem-translator-api@0.0.1 build:acc /codebuild/output/src400516343/src/github.com/svabra/semtranslatorapi
> tsc
src/ExpressServer.ts(11,31): error TS2307: Cannot find module './endpoints/termEndpoints'.
src/ExpressServer.ts(12,38): error TS2307: Cannot find module './endpoints/translationEndpoints'.
src/ExpressServer.ts(13,35): error TS2307: Cannot find module './endpoints/LanguageEndpoints'.
src/models/relation.ts(3,22): error TS2307: Cannot find module './Term'.
npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! sem-translator-api@0.0.1 build:acc: `tsc`
npm ERR! Exit status 2
npm ERR!
npm ERR! Failed at the sem-translator-api@0.0.1 build:acc script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2020-05-11T10_06_18_948Z-debug.log
[Container] 2020/05/11 10:06:18 Command did not exit successfully npm run build:acc exit status 2
[Container] 2020/05/11 10:06:19 Phase complete: BUILD State: FAILED
[Container] 2020/05/11 10:06:19 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: npm run build:acc. Reason: exit status 2
失败原因:菜鸟错误
我只回应其他Windows用户学习(支持菜鸟是对自己的羞辱)。
错误是由于 windows 不区分大小写造成的。我从不使用大写文件名,但出于某些原因,我曾经为 TermEndpoints.ts
(和另一个)使用过。在导入小写 termEndpoints.ts
文件时,这在 Windows 10 中当然有效。无论如何,我早些时候看到它并修复了它 - 但未能上游 -u
它(git push -u origin master
).因此我认为它是固定的。事实并非如此。抱歉大家一直在等。
不区分大小写的风险
DevOps-wise 这可能是一个耗时的惩罚 - 或者 - 如果您错过了 linux 危险场景的端到端测试。未通过验收测试或生产发布。
消除风险:进行区分大小写检查
没有经验教训就不是工程师。这是 webpack 的 npm package 安全防护,它强制执行区分大小写的路径。正是我们需要什么来防止这种风险。这可以应用于 javascript 以及打字稿(无论如何都应该在发布之前将打字稿转换为 javascript --> tsc -p .
)
另一种选择是(就像我所做的那样)编写您自己的脚本以在部署时测试引用。例如我正在接入 AWS Elastic Beanstalk .ebextensions。我在 .ebextensions 文件夹中的 .config 文件中调用该命令。当然,还有许多其他解决方案如何调用您的验证脚本。
降低风险:克隆您的生产环境
如果您觉得这永远不会发生在您身上,因为您是在 Linux 或 Max(也不是您的继任者)上进行开发,请确保最晚您的验收测试环境是生产环境的克隆。因为不只是 Windows 的不区分大小写可以让你。还有文件系统的大小写保存,unicode格式保存等等。
现在使用 Docker、AWS Beanstalk、AWS CloudFormation 或 TerraForm(Azure 和 Google 有类似的服务)克隆环境很容易。前者可以通过单击进行克隆,后两者允许您编写基础架构脚本并启动新实例以进行集成、验收测试、生产等。确保 DevOps 成功。
我无法在 AWS CodeBuild(Ubuntu 图像)中转换我的打字稿文件,TS2307 错误无法解析我自己的文件。
当然,我在本地尝试了完全相同的项目。调用 tsc
,它正在读取项目目录根目录中的 tsconfig.json 文件。然后我会 运行 node ./dist/index.js
使用节点执行应用程序(而不是 ts-node ./src/index.ts
)。有效(REST 服务提供 json 数据)。
在 AWS CodeBuild 中,tsc
失败。
这些是我的代码行,相对无法解析。在有绝对导入(例如 import * as express from 'express'
)之前都可以正常工作。
有人知道为什么在 AWS CodeBuild 中没有 resolve/transpile 尽管它是相同的项目文件(都是在从 github 拉取之后)?我缺少什么标志?
我在本地使用 Windows。并且 Ubuntu 在 CodeBuild 中。
import { TermEndpoints } from './endpoints/termEndpoints'
import { TranslationEndpoints } from './endpoints/translationEndpoints'
import { LanguageEndpoints } from './endpoints/LanguageEndpoints'
import { NavLangEndpoints} from './endpoints/navLangEndpoints'
import { InfoEndpoint } from './endpoints/infoEndpoint'
我的 tsconfig.json 文件是
{
"compilerOptions": {
"baseUrl": "./src/",
"outDir": "./dist",
"allowJs": true,
"target": "es2017",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": false,
"strict": false,
"declaration": true,
"experimentalDecorators": true,
"importHelpers": true,
"esModuleInterop": false,
"resolveJsonModule": true,
"removeComments": true,
"types": ["node"],
"typeRoots": [
"node_modules/@types"
],
"lib": [ "es2017", "dom" ]
},
"include": [
"./src/**/*"
]
}
Code Build 的日志文件
[Container] 2020/05/11 10:06:10 Running command npm install typescript
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@2.1.2 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.1.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
+ typescript@3.8.3
updated 1 package and audited 655 packages in 2.484s
found 0 vulnerabilities
[Container] 2020/05/11 10:06:13 Running command tsc --version
Version 3.8.3
[Container] 2020/05/11 10:06:13 Running command npm run build:acc
> sem-translator-api@0.0.1 build:acc /codebuild/output/src400516343/src/github.com/svabra/semtranslatorapi
> tsc
src/ExpressServer.ts(11,31): error TS2307: Cannot find module './endpoints/termEndpoints'.
src/ExpressServer.ts(12,38): error TS2307: Cannot find module './endpoints/translationEndpoints'.
src/ExpressServer.ts(13,35): error TS2307: Cannot find module './endpoints/LanguageEndpoints'.
src/models/relation.ts(3,22): error TS2307: Cannot find module './Term'.
npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! sem-translator-api@0.0.1 build:acc: `tsc`
npm ERR! Exit status 2
npm ERR!
npm ERR! Failed at the sem-translator-api@0.0.1 build:acc script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2020-05-11T10_06_18_948Z-debug.log
[Container] 2020/05/11 10:06:18 Command did not exit successfully npm run build:acc exit status 2
[Container] 2020/05/11 10:06:19 Phase complete: BUILD State: FAILED
[Container] 2020/05/11 10:06:19 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: npm run build:acc. Reason: exit status 2
失败原因:菜鸟错误
我只回应其他Windows用户学习(支持菜鸟是对自己的羞辱)。
错误是由于 windows 不区分大小写造成的。我从不使用大写文件名,但出于某些原因,我曾经为 TermEndpoints.ts
(和另一个)使用过。在导入小写 termEndpoints.ts
文件时,这在 Windows 10 中当然有效。无论如何,我早些时候看到它并修复了它 - 但未能上游 -u
它(git push -u origin master
).因此我认为它是固定的。事实并非如此。抱歉大家一直在等。
不区分大小写的风险
DevOps-wise 这可能是一个耗时的惩罚 - 或者 - 如果您错过了 linux 危险场景的端到端测试。未通过验收测试或生产发布。
消除风险:进行区分大小写检查
没有经验教训就不是工程师。这是 webpack 的 npm package 安全防护,它强制执行区分大小写的路径。正是我们需要什么来防止这种风险。这可以应用于 javascript 以及打字稿(无论如何都应该在发布之前将打字稿转换为 javascript --> tsc -p .
)
另一种选择是(就像我所做的那样)编写您自己的脚本以在部署时测试引用。例如我正在接入 AWS Elastic Beanstalk .ebextensions。我在 .ebextensions 文件夹中的 .config 文件中调用该命令。当然,还有许多其他解决方案如何调用您的验证脚本。
降低风险:克隆您的生产环境
如果您觉得这永远不会发生在您身上,因为您是在 Linux 或 Max(也不是您的继任者)上进行开发,请确保最晚您的验收测试环境是生产环境的克隆。因为不只是 Windows 的不区分大小写可以让你。还有文件系统的大小写保存,unicode格式保存等等。
现在使用 Docker、AWS Beanstalk、AWS CloudFormation 或 TerraForm(Azure 和 Google 有类似的服务)克隆环境很容易。前者可以通过单击进行克隆,后两者允许您编写基础架构脚本并启动新实例以进行集成、验收测试、生产等。确保 DevOps 成功。