typescript 部署Node,js Google Cloud Function with tsconfig,json扩展父级tsconfig,json

g6ll5ycj  于 2023-05-01  发布在  TypeScript
关注(0)|答案(1)|浏览(105)

我曾经使用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在部署/构建期间或以某种方式将其包含在构建中)。
任何帮助将不胜感激,谢谢!

n9vozmp4

n9vozmp41#

让我们检查一下用于部署函数的命令,同时只查看与您的问题相关的部分:

gcloud functions deploy testFunction --source ./testFunction

这告诉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。它在部署之前执行许多任务作为保护措施:

  1. cd functions/testFunction
  2. yarn install --immutable --immutable-cache --mode=skip-build必须检查其包
  3. yarn tsc以确保构建
  4. yarn eslint .以确保其有效
  5. yarn vitest run以确保测试通过
  6. functions/testFunction/bin/deploy.sh运行该函数的自定义gcloud functions deploy命令
    有了这个,我就不再依赖Cloud Build来运行tsc了;我通过gcloud functions deploy发布的所有内容都已经构建好,可以部署。如果您仍然希望Cloud Build为您运行tsc,则可以在脚本中添加一个步骤,在部署之前修改tsconfig.json,然后在部署之后撤消更改:
mv -f tsconfig.json tsconfig.testFunction.json && # Rename existing file
  cp -f ../tsconfig.json . &&                     # Copy parent file to this function
  gcloud functions deploy ... ;                   # Deploy the function and regardless of success or failure run the next command
  mv -f tsconfig.testFunction.json tsconfig.json  # Restore the original file

相关问题