我曾经使用gcloud functions deploy testFunction --region europe-west1 --trigger-http --runtime nodejs16 --source ./testFunction --set-env-vars ...
的CI工具部署我的Google Cloud Functions我的目录结构如下(仅显示必要的文件):
.
├── testFunction
│ ├── package.json
│ ├── src
│ │ └── index.ts
│ └── tsconfig.json
└── tsconfig.json
我的问题
由于大约2天,我的谷歌云函数有一个错误,而在谷歌云构建。问题是tsconfig。无法找到根目录中的json。当我尝试下载上传到Google的源代码时,我可以看到只有testFunction目录正在上传。有趣的是,它以前也是这样,并且奏效了。因此,我认为出于某种原因,Google忽略了tsconfig。json过去?
文件testFunction/tsconfig.json
从根文件夹扩展父文件/tsconfig.json
:
// /testFunction/tsconfig.json
{
"extends": "../tsconfig.json",
"include": ["./src"],
"compilerOptions": {
"outDir": "./build",
"rootDir": "./src",
"tsBuildInfoFile": "buildcache.tsbuildinfo"
}
}
尝试过的事情/临时解决方案
目前,我找到了两个临时解决方案:
1.复制父tsconfig的内容。json,不扩展父tsconfig。json
1.使用ln -s
创建别名,并将父tsconfig.json
链接为parent.tsconfig.json
,并将其扩展。
这两种解决方案似乎都不是很优雅,我想知道为什么突然发生这种变化,是否有更好的解决方案(比如解析父tsconfig)。json在部署/构建期间或以某种方式将其包含在构建中)。
任何帮助将不胜感激,谢谢!
1条答案
按热度按时间n9vozmp41#
让我们检查一下用于部署函数的命令,同时只查看与您的问题相关的部分:
这告诉
gcloud
应用程序获取目录./testFunction
及其内容并将其发送到Cloud Build。需要注意的是,它只发送*该目录及其内容;它们成为Cloud Build的构建上下文**,就像Docker build context一样。我不能说为什么或如何这似乎为你工作在过去。我假设您误解了在早期部署中发生的事情,或者已经更改了配置,因为我在
gcloud functions deploy
的构建上下文中所描述的内容一直都是正确的。符号链接也会有问题,因为如果
./testFunction
中有一个指向../tsconfig.json
的符号链接,那么当Cloud Build解包构建上下文时,它将指向父目录中不存在的文件。例如,如果它解包到/app
,它会在解包的容器中寻找/tsconfig.json
,但找不到。在部署Cloud Functions时,了解构建上下文非常重要。看起来你有一个monorepo,我假设你有不止一个功能。请记住,如果您告诉它使用
.
作为--source
(或者省略--source
),那么它将发送整个目录结构作为构建上下文。这可能不是你想要的,因为你可能有很多代码不需要构建一个函数。我建议您在调用
gcloud functions deploy
之前运行某种预部署脚本来准备函数。对于我为Cloud Functions运行的monorepo,我有一个名为bin/deploy.sh
的脚本,它接受函数的路径作为参数,e。例如,bin/deploy.sh functions/testFunction
。它在部署之前执行许多任务作为保护措施:cd functions/testFunction
yarn install --immutable --immutable-cache --mode=skip-build
必须检查其包yarn tsc
以确保构建yarn eslint .
以确保其有效yarn vitest run
以确保测试通过functions/testFunction/bin/deploy.sh
运行该函数的自定义gcloud functions deploy
命令有了这个,我就不再依赖Cloud Build来运行
tsc
了;我通过gcloud functions deploy
发布的所有内容都已经构建好,可以部署。如果您仍然希望Cloud Build为您运行tsc
,则可以在脚本中添加一个步骤,在部署之前修改tsconfig.json
,然后在部署之后撤消更改: