Firebase 函数在项目外部导入子路径
我有一个使用 typescript 的 firebase functions 项目。在这个项目中,我使用项目外部的类型和子路径导入,结果导致构建文件出现偏差。
我没有使用
main:lib/index.js
,而是使用
main:lib/functions/src/index.js
functions/lib
:
petertoth@Peters-MBP-2 lib % tree .
.
├── functions
│ └── src
│ ├── index.js
│ ├── index.js.map
│ ├── journalLogs.type.js
│ ├── journalLogs.type.js.map
│ └── util
│ ├── audiFiles.js
│ ├── audiFiles.js.map
│ ├── db.js
│ ├── db.js.map
│ ├── getJournalSettings.js
│ ├── getJournalSettings.js.map
│ ├── prompt.js
│ ├── prompt.js.map
│ ├── storage.js
│ └── storage.js.map
└── types
├── firebase
│ ├── CreateFullRecording.request.js
│ ├── CreateFullRecording.request.js.map
│ ├── generateJournal.requests.js
│ └── generateJournal.requests.js.map
├── firestore
│ ├── JournalSettingsDoc.js
│ └── JournalSettingsDoc.js.map
└── openai
├── language.js
└── language.js.map
package.json:
{
"name": "functions",
...
"imports": {
"#types/*": ["../types/*"]
},
"engines": {
"node": "16"
},
"main": "lib/functions/src/index.js",
"private": true
...
}
tsconfig:
{
"compilerOptions": {
"module": "commonjs",
"noImplicitReturns": true,
"noUnusedLocals": true,
"outDir": "lib",
"sourceMap": true,
"strict": true,
"target": "es2017",
"moduleResolution": "nodenext",
"paths": {
"#types/*": ["../types/*"]
}
},
"baseUrl": ".",
"compileOnSave": true,
"include": [
"src"
]
}
这在本地运行良好,我可以很好地使用它。但是当我尝试部署时:
firebase deploy --only functions
我收到以下错误:
i deploying functions
Running command: npm --prefix "$RESOURCE_DIR" run build
> build
> tsc
✔ functions: Finished running predeploy script.
i functions: preparing codebase default for deployment
i functions: ensuring required API cloudfunctions.googleapis.com is enabled...
i functions: ensuring required API cloudbuild.googleapis.com is enabled...
i artifactregistry: ensuring required API artifactregistry.googleapis.com is enabled...
✔ functions: required API cloudfunctions.googleapis.com is enabled
✔ artifactregistry: required API artifactregistry.googleapis.com is enabled
✔ functions: required API cloudbuild.googleapis.com is enabled
i functions: preparing ./functions/ directory for uploading...
i functions: packaged XX (98.13 KB) for uploading
✔ functions: ./functions/ folder uploaded successfully
i functions: updating Node.js 16 function generateJournal(europe-west1)...
i functions: updating Node.js 16 function migrageJournal(europe-west1)...
i functions: updating Node.js 16 function getCollectionNames(europe-west1)...
i functions: updating Node.js 16 function createFullRecording(europe-west1)...
Build failed: > build
> tsc
src/index.ts(22,44): error TS2307: Cannot find module '#types/firebase/CreateFullRecording.request' or its corresponding type declarations.
src/index.ts(25,40): error TS2307: Cannot find module '#types/firebase/generateJournal.requests' or its corresponding type declarations.
src/util/getJournalSettings.ts(1,36): error TS2307: Cannot find module '#types/firestore/JournalSettingsDoc' or its corresponding type declarations.
src/util/prompt.ts(1,36): error TS2307: Cannot find module '#types/firestore/JournalSettingsDoc' or its corresponding type declarations.
src/util/prompt.ts(2,30): error TS2307: Cannot find module '#types/openai/language' or its corresponding type declarations.
src/util/prompt.ts(15,31): error TS18046: 'journalBullet' is of type 'unknown'.
src/util/prompt.ts(16,34): error TS18046: 'journalBullet' is of type 'unknown'.
src/util/prompt.ts(48,10): error TS7053: Element implicitly has an 'any' type because expression of type 'LanguageCode' can't be used to index type '{ en: string; da: string; sv: string; no: string; de: string; }'.; Error ID: 1a2262f3
我认为要上传的文件打包配置有问题。但这只是一种预感,我不知道如何进一步调试它。
更新您的 Firebase CLI:
npm install -g firebase-tools
Google Cloud Functions 现在在部署期间运行
npm run build
,这似乎导致了问题。
但是,根据 colerogers 的此评论 ,Firebase 团队修补了他们的 CLI 以在 firebase-tools v11.27.0 中停用此功能。
If you upgrade to at least that version, this error should go away without any additional work.
我还看到了文件移动到
lib/functions/src/index.js
下的效果,令人困惑的“src”文件夹与构建输出混合在一起。如果您从 Typscript 构建文件夹上方引用导入,而不使用对另一个 TS 项目的“引用”,就会发生这种情况。我认为这是 TSC 试图找到所有导入的根公共路径并向上移动项目文件夹。因此,“src”文件夹不被视为特殊文件夹,它只是被视为某个子文件夹。这可能不是您希望构建的结果 - 即使它在本地
可以正常工作
。
要解决此问题,您需要在“types”文件夹中添加另一个 tsconfig,使其成为自己的 TS 项目。然后将项目引用添加到您的主 tsconfig:
"references": [
{
"path": "../types"
}
]
并调整您的 TS 构建以使用
package.json
中的
--build
标志
"build": "tsc --build ",
如果执行此操作,则在重建时,主项目输出将移回两个文件夹,它应该在
lib
中,即
lib/index.js
和
lib/util/*
等。(您可能需要先删除 lib 文件夹以清理它)。
好的,这应该已经修复了奇怪的构建,但是当您部署它时仍然不会上传 lib/types,因为正如 Doug 解释的那样,它们(现在)不在 functions 文件夹中,并且仅在本地引用。
我之前已经通过使用部署前构建脚本,将 lib 项目打包成 GZ,并将其作为文件依赖项添加到主项目中。
在“类型”库项目下的
package.json
中,您只需要名称、版本和构建运行脚本:
{
"name": "my-lib",
"version": "1.0.0",
"scripts": {
"build": "npm pack"
},
运行
npm run build
将压缩库,例如:
my-lib-1.0.0.gz
您需要将此文件从 /lib 复制到 /functions/ (或子文件夹)。
然后,您需要主项目
package.json
中的正确版本,例如:
"main": "lib/index.js",
"dependencies": {
"#types": "file:my-lib-1.0.0.tgz"
},
然后,当您部署函数时,GZ 会在部署构建期间从容器中的本地文件上传和解析。
我编写了一个 bash 脚本来在部署之前执行此操作,这也是白痴检查版本如下:
echo Packaging the latest my-lib and import to gcp/functions...
echo Note: the functions package.json must require the new version.
#read -p "Press any key..."
cd libs/my-lib;
# Detect the current version
LIB_VERSION=`node -pe "require('./package.json').version"`
echo Version \($LIB_VERSION\) detected OK?
read -p "Press any key..."
# Package the latest version
LIB_FILENAME=my-lib-${LIB_VERSION}.tgz
npm run build;
# Move it into the Cloud Function folder so the tarfile can be deployed.
mv $LIB_FILENAME ../../gcp/functions;
# Reinstall it locally too
cd ../../gcp/functions;
npm i $LIB_FILENAME
cd ..
我不确定接受的答案如何解决您的问题。