Hé, les gars ~ Je ne peux pas déployer quand j'attribue des arguments paths
dans tsconfig.json
, comme ceci:
{
"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"]
}
Les arguments paths
utilisent généralement TypeScript et fonctionnent parfaitement. Mais le déploiement de Firebase renvoie cette erreur:
Error: Error parsing triggers: Cannot find module '@custom-modules/moduleName'
Cette question a déjà été publiée dans StackOverFlow Comment utiliser TS Path Mapping avec Firebase Cloud Functions , et pour l'instant, quelqu'un peut-il m'aider? Merci ~ 🤣
Au fur et à mesure de ma compréhension, baseUrl
et paths
ne sont utilisés que par le compilateur et linter pour comprendre les typages et l'emplacement des modules. Ces deux propriétés ne disent pas au compilateur de _inclure_ ces chemins mappés dans la compilation ou de modifier les instructions import
pour qu'elles fonctionnent pendant la compilation. Jetez un œil au répertoire compilé lib
pour voir que l'instruction @custom-modules/*
import
n'a pas changé.
Cela dit, l'erreur vient du fait que dans le processus de déploiement, la CLI interprète le code des fonctions pour comprendre quelles fonctions doivent être déployées. Puisque le code des fonctions nécessite un module dont il n'a aucune connaissance (c'est dans le dossier lib
, rappelez-vous), une erreur est lancée qui affiche ce message.
Si vous essayez de sauvegarder un peu de frappe en faisant import ... from "@custom-modules/...";
et en remappant ailleurs dans votre structure, vous pouvez résoudre ce problème en effectuant des importations relatives, ce qui est probablement la méthode recommandée de toute façon. Je ne crois pas que baseUrl
et paths
sont la réponse que vous cherchez.
Salut! Je souhaite ajouter plus d'informations sur ce problème, car je l'ai également rencontré.
Dans mon autre projet Node.js + TypeScript, le problème était en place, car, comme expliqué ci-dessus, Typescript ne change pas, nécessite des chemins dans la sortie JS. La seule solution de travail que j'ai pu trouver est https://github.com/dividab/tsconfig-paths#with -node, qui modifie le mode de gestion des chemins Node.js en fonction du fichier de configuration tsconfig.json
. Cela fonctionne grâce à l'argument -r tsconfig-paths/register
passé à Node, et l'exécution de register
à l'exécution (même tout en haut de index.ts) ne semble pas fonctionner dans Firebase Functions.
Avoir des chemins relatifs me semble très gênant, car j'ai un peu common
qui est également utilisé par le code du frontend, le chemin relatif vers celui-ci ressemblerait à ../../../common
dans index.ts, et encore plus moche dans les sous-dossiers.
Alors peut-être existe-t-il un moyen d'ajouter cet argument -r tsconfig-paths/register
pour les fonctions Firebase, y compris les environnements locaux et de production?
J'ai trouvé que https://www.npmjs.com/package/module-alias fonctionnait pour moi.
Créez un nouveau fichier /src/fixTsPaths.ts
:
import * as ModuleAlias from 'module-alias'
ModuleAlias.addAliases({
helpers: __dirname + '/helpers',
})
Importez-le dans /scr/index.ts
.
import * as functions from 'firebase-functions'
import * as admin from 'firebase-admin'
import './fixTsPaths'
Commentaire le plus utile
Salut! Je souhaite ajouter plus d'informations sur ce problème, car je l'ai également rencontré.
Dans mon autre projet Node.js + TypeScript, le problème était en place, car, comme expliqué ci-dessus, Typescript ne change pas, nécessite des chemins dans la sortie JS. La seule solution de travail que j'ai pu trouver est https://github.com/dividab/tsconfig-paths#with -node, qui modifie le mode de gestion des chemins Node.js en fonction du fichier de configuration
tsconfig.json
. Cela fonctionne grâce à l'argument-r tsconfig-paths/register
passé à Node, et l'exécution deregister
à l'exécution (même tout en haut de index.ts) ne semble pas fonctionner dans Firebase Functions.Avoir des chemins relatifs me semble très gênant, car j'ai un peu
common
qui est également utilisé par le code du frontend, le chemin relatif vers celui-ci ressemblerait à../../../common
dans index.ts, et encore plus moche dans les sous-dossiers.Alors peut-être existe-t-il un moyen d'ajouter cet argument
-r tsconfig-paths/register
pour les fonctions Firebase, y compris les environnements locaux et de production?