开发者问题收集

Firebase 函数在项目外部导入子路径

2023-05-02
899

我有一个使用 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

我认为要上传的文件打包配置有问题。但这只是一种预感,我不知道如何进一步调试它。

2个回答

更新您的 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.

Anis Abboud
2023-05-08

我还看到了文件移动到 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.jslib/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 ..

我不确定接受的答案如何解决您的问题。

scipilot
2023-10-25