Firebase-tools: Não é possível encontrar o módulo '@ custom-modules / moduleName' ao implantar usando TypeScript

Criado em 1 nov. 2018  ·  3Comentários  ·  Fonte: firebase/firebase-tools

Ei, pessoal ~ Não consigo implantar quando atribuo paths argumentos em tsconfig.json , como este:

{
  "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"]
}

Os argumentos paths geralmente usam TypeScript e funcionam perfeitamente. Mas o Firebase deploy gera esse erro:

Error: Error parsing triggers: Cannot find module '@custom-modules/moduleName'

Esta questão foi publicada no StackOverFlow antes de Como usar o mapeamento de caminho TS com o Firebase Cloud Functions e, por enquanto, alguém pode me ajudar? Obrigado ~ 🤣

question

Comentários muito úteis

Olá! Quero adicionar mais informações sobre esse problema, porque também encontrei.
Em meu outro projeto Node.js + TypeScript, o problema estava no lugar, porque, como explicado acima, o Typescript não muda exige caminhos no JS de saída. A única solução funcional que consegui encontrar é https://github.com/dividab/tsconfig-paths#with -node, que muda os caminhos do Node.js para lidar com a forma com base no arquivo de configuração tsconfig.json . Isso funciona graças ao argumento -r tsconfig-paths/register passado para o Node, e a execução de register em tempo de execução (mesmo no topo de index.ts) não parece funcionar em funções do Firebase.

Ter caminhos relativos parece muito inconveniente para mim, porque tenho uma espécie de pasta common que também é usada pelo código de front-end, o caminho relativo para ele seria semelhante a ../../../common em index.ts, e ainda mais feio em subpastas.

Então, talvez haja uma maneira de adicionar este argumento -r tsconfig-paths/register para funções do Firebase, incluindo ambientes locais e de produção?

Todos 3 comentários

Como meu entendimento funciona, baseUrl e paths são usados ​​apenas pelo compilador e linter para entender a tipificação e localização dos módulos. Essas duas propriedades _não_ dizem ao compilador para _incluir_ os caminhos mapeados na compilação ou alterar as instruções import para funcionarem durante o tempo de compilação. Dê uma olhada no diretório lib compilado para ver se a instrução @custom-modules/* import não mudou.

Dito isso, o erro está no fato de que, no processo de implantação, a CLI interpreta o código das funções para entender quais funções precisam ser implantadas. Uma vez que o código de funções requer um módulo do qual ele não tem conhecimento (ele está na pasta lib , lembre-se), um erro é gerado e imprime essa mensagem.

Se você está tentando economizar alguma digitação fazendo import ... from "@custom-modules/..."; e remapeando para outro lugar em sua estrutura, você pode consertar isso fazendo importações relativas, que provavelmente é a forma recomendada de qualquer maneira. Não acredito que baseUrl e paths sejam a resposta que você está procurando.

Olá! Quero adicionar mais informações sobre esse problema, porque também encontrei.
Em meu outro projeto Node.js + TypeScript, o problema estava no lugar, porque, como explicado acima, o Typescript não muda exige caminhos no JS de saída. A única solução funcional que consegui encontrar é https://github.com/dividab/tsconfig-paths#with -node, que muda os caminhos do Node.js para lidar com a forma com base no arquivo de configuração tsconfig.json . Isso funciona graças ao argumento -r tsconfig-paths/register passado para o Node, e a execução de register em tempo de execução (mesmo no topo de index.ts) não parece funcionar em funções do Firebase.

Ter caminhos relativos parece muito inconveniente para mim, porque tenho uma espécie de pasta common que também é usada pelo código de front-end, o caminho relativo para ele seria semelhante a ../../../common em index.ts, e ainda mais feio em subpastas.

Então, talvez haja uma maneira de adicionar este argumento -r tsconfig-paths/register para funções do Firebase, incluindo ambientes locais e de produção?

Descobri que https://www.npmjs.com/package/module-alias funcionou para mim.

  1. Faça um novo arquivo /src/fixTsPaths.ts :

    import * as ModuleAlias from 'module-alias'
    
    ModuleAlias.addAliases({
      helpers: __dirname + '/helpers',
    })
    
  2. Importe-o em /scr/index.ts .

    import * as functions from 'firebase-functions'
    import * as admin from 'firebase-admin'
    import './fixTsPaths'
    
Esta página foi útil?
0 / 5 - 0 avaliações