我正在尝试从头开始使用Typescript构建我的GCF项目。我在这个项目(和这个问题)中的目标是了解云功能如何工作并手动执行所有设置步骤,所以这就是为什么我不复制任何示例代码或使用自动化工具的原因。
首先,这是我的src/index.ts
文件:
export const helloWorld = (req: any, res: any) => {
res.send('Hello, world 4');
}
运行Typescript编译器后,我得到了这个dist/index.js
文件,这似乎很合理:
"use strict";
exports.__esModule = true;
exports.helloWorld = function (req, res) {
res.send('Hello, world 4');
};
我的package.json
已设置为指向该文件:
{
"main": "dist/index.js",
"scripts": {
"start": "npx tsc-watch --onSuccess 'npx @google-cloud/functions-framework --target=helloWorld'",
"deploy": "gcloud functions deploy helloWorld --runtime nodejs10 --trigger-http"
},
"dependencies": {
"@google-cloud/functions-framework": "^1.1.2",
"tsc-watch": "^2.2.1",
"typescript": "^3.5.3"
}
}
我想先设置本地测试环境,所以我使用了functions framework。当我运行它时,一切都完美运行:
$ npx @google-cloud/functions-framework --target=helloWorld
Serving function...
Function: helloWorld
URL: http://localhost:8080/
但是,当我尝试部署时,出现此错误:
$ gcloud functions deploy helloWorld --runtime nodejs10 --trigger-http
Created .gcloudignore file. See `gcloud topic gcloudignore` for details.
Deploying function (may take a while - up to 2 minutes)...failed.
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function failed on loading user code. Error message: Provided code is not a loadable module.
Could not load the function, shutting down.
为什么说我的index.js
不是可加载模块,如何解决此错误?
更新
结果是gcloud
不遵守package.json
的{{1}}字段。当我指定应该使用main
标志将dist
文件夹显式地放置时,它部署了文件:
--source
但是,它仍然不起作用,因为它似乎假设所有,包括package.json,都包含在此目录中-因此它不链接任何库依赖项。 / p>
答案 0 :(得分:1)
在!/dist
文件的#!include:.gitignore
之后添加.gcloudignore
。
我认为最好将#!include:.gitnore
行保留在.gcloudignore
文件中,以便当人们向.gitignore
添加内容时,它会自动包含在{{1 }}。
对于希望由.gcloudignore
而不是git
忽略的文件和目录,我将在gcloud
文件中明确地添加它们。
让我们以我的示例为例,其中有一个TypeScript项目。我不希望.gcloudignore
的输出受版本控制,但是出于明显的原因,我确实希望这些文件包含在tsc
中:gcloud
(或{{ 1}})文件夹实际上是我的功能(应用程序)。
built
我更喜欢这种解决方案,因为默认情况下,gcloud也会忽略git中忽略的文件,因此我不必担心人们会忘记我们有多个忽略文件。
答案 1 :(得分:0)
结果是,.gitnore
默认情况下被导入到GCF的.gcloudignore
文件中,并且由于我忽略了.gitignore
中的js文件,因此它们从不进入GCF。
要修复此问题,只需删除以下行:
#!include:.gitnore
我还创建了small template project以便将Typescript与GCF结合使用。