Hey, Leute ~ Ich kann nicht bereitstellen, wenn ich paths
Argumente in tsconfig.json
wie
{
"compilerOptions": {
"lib": ["es6"],
"module": "commonjs",
"outDir": "lib",
"rootDir": "src",
"target": "es6",
"sourceMap": true,
"noImplicitReturns": true,
"baseUrl": ".",
// here, I assign a paths arguments
"paths": {
"@custom-modules/*": ["src/modules/*"],
}
},
"compileOnSave": true,
"include": ["src"]
}
Die paths
Argumente verwenden normalerweise TypeScript und es funktioniert perfekt. Aber Firebase Deploy wirft diesen Fehler:
Error: Error parsing triggers: Cannot find module '@custom-modules/moduleName'
Diese Frage wurde in StackOverFlow veröffentlicht, bevor TS Path Mapping mit Firebase Cloud-Funktionen verwendet wird. Kann mir vorerst jemand helfen? Danke ~ 🤣
Nach meinem Verständnis werden baseUrl
und paths
nur vom Compiler und Linter verwendet, um die Typisierung und Position der Module zu verstehen. Diese beiden Eigenschaften weisen den Compiler nicht an, diese zugeordneten Pfade in die Kompilierung einzubeziehen oder die import
-Anweisungen so zu ändern, dass sie während der Kompilierungszeit funktionieren. Sehen Sie sich das kompilierte Verzeichnis lib
an, um festzustellen, dass sich die Anweisung @custom-modules/*
import
nicht geändert hat.
Der Fehler ist jedoch darauf zurückzuführen, dass die CLI im Bereitstellungsprozess den Funktionscode interpretiert, um zu verstehen, welche Funktionen bereitgestellt werden müssen. Da für den Funktionscode ein Modul erforderlich ist, von dem er keine Kenntnis hat (dies befindet sich im Ordner lib
, denken Sie daran), wird ein Fehler ausgegeben, der diese Nachricht ausgibt.
Wenn Sie versuchen, etwas zu tippen, indem Sie import ... from "@custom-modules/...";
ausführen und an einer anderen Stelle in Ihrer Struktur neu zuordnen, können Sie dies beheben, indem Sie relative Importe durchführen, was wahrscheinlich ohnehin der empfohlene Weg ist. Ich glaube nicht, dass baseUrl
und paths
die Antwort sind, nach der Sie suchen.
Hallo! Möchten Sie weitere Informationen zu diesem Problem hinzufügen, da ich auch darauf gestoßen bin.
In meinem anderen Node.js + TypeScript-Projekt war das Problem vorhanden, da Typescript, wie oben erläutert, keine Pfade in der Ausgabe-JS erfordert. Die einzige funktionierende Lösung, die ich finden konnte, ist https://github.com/dividab/tsconfig-paths#with -node, wodurch die Art und Weise der Behandlung von Node.js-Pfaden basierend auf der Konfigurationsdatei tsconfig.json
geändert wird. Dies funktioniert dank des an Node übergebenen Arguments -r tsconfig-paths/register
, und die Ausführung von register
zur Laufzeit (selbst ganz oben in index.ts) scheint in Firebase-Funktionen nicht zu funktionieren.
Relative Pfade zu haben scheint mir sehr unpraktisch zu sein, da ich einen Ordner common
, der auch vom Frontend-Code verwendet wird. Der relative Pfad dazu würde in index.ts wie ../../../common
aussehen und noch hässlicher in Unterordnern.
Vielleicht gibt es also eine Möglichkeit, dieses -r tsconfig-paths/register
-Argument für Firebase-Funktionen hinzuzufügen, einschließlich lokaler und Produktionsumgebungen?
Ich habe festgestellt, dass https://www.npmjs.com/package/module-alias für mich funktioniert hat.
Erstellen Sie eine neue Datei /src/fixTsPaths.ts
:
import * as ModuleAlias from 'module-alias'
ModuleAlias.addAliases({
helpers: __dirname + '/helpers',
})
Importieren Sie es in /scr/index.ts
.
import * as functions from 'firebase-functions'
import * as admin from 'firebase-admin'
import './fixTsPaths'
Hilfreichster Kommentar
Hallo! Möchten Sie weitere Informationen zu diesem Problem hinzufügen, da ich auch darauf gestoßen bin.
In meinem anderen Node.js + TypeScript-Projekt war das Problem vorhanden, da Typescript, wie oben erläutert, keine Pfade in der Ausgabe-JS erfordert. Die einzige funktionierende Lösung, die ich finden konnte, ist https://github.com/dividab/tsconfig-paths#with -node, wodurch die Art und Weise der Behandlung von Node.js-Pfaden basierend auf der Konfigurationsdatei
tsconfig.json
geändert wird. Dies funktioniert dank des an Node übergebenen Arguments-r tsconfig-paths/register
, und die Ausführung vonregister
zur Laufzeit (selbst ganz oben in index.ts) scheint in Firebase-Funktionen nicht zu funktionieren.Relative Pfade zu haben scheint mir sehr unpraktisch zu sein, da ich einen Ordner
common
, der auch vom Frontend-Code verwendet wird. Der relative Pfad dazu würde in index.ts wie../../../common
aussehen und noch hässlicher in Unterordnern.Vielleicht gibt es also eine Möglichkeit, dieses
-r tsconfig-paths/register
-Argument für Firebase-Funktionen hinzuzufügen, einschließlich lokaler und Produktionsumgebungen?