Pesquisa de site

node.js - tsc não encontrado em aplicativo typescript express e react ao implantar no heroku


Estou trabalhando em um aplicativo Express (em TypeScript) e um aplicativo React inicializado com create-react-app (em JS). A estrutura de diretórios é a seguinte. O diretório do servidor contém o código do servidor, que está dentro de server/src e é escrito em TypeScript (gerando saída em server/dist ao construir). Da mesma forma, o código do React está dentro de /src e, ao construir, gera o diretório /build.

O problema é quando fazendo o deploy no Heroku, o comando tsc não está funcionando e, portanto, a compilação falha O rastreamento da pilha é -

2020-11-29T10:11:12.328622+00:00 app[web.1]: > cd server && yarn start
2020-11-29T10:11:12.781818+00:00 app[web.1]: yarn run v1.22.10
2020-11-29T10:11:12.832721+00:00 app[web.1]: $ tsc & node .
2020-11-29T10:11:12.850144+00:00 app[web.1]: /bin/sh: 1: tsc: not found
2020-11-29T10:11:12.905249+00:00 app[web.1]: internal/modules/cjs/loader.js:303
2020-11-29T10:11:12.905252+00:00 app[web.1]: throw err;
2020-11-29T10:11:12.905253+00:00 app[web.1]: ^
2020-11-29T10:11:12.905253+00:00 app[web.1]: 

Como devo incluí-lo no(s) package.json para que este comando seja reconhecido no ambiente de implantação do Heroku.

Scripts do Package.json para aplicativo React são

"scripts": {
    "startClient": "react-scripts start",
    "buildClient": "react-scripts build",
    "build": "react-scripts build && (cd server && yarn install)",
    "start":"cd server && yarn start",
    "devServer":"cd server && yarn dev",
    "tsc": "tsc",  // 1)
    "postinstall": "yarn tsc" // 2)
  },

1 e 2 foram adicionados seguindo a sugestão em Como faço para compilar Typescript no postinstall do Heroku?.

O script package.json para o aplicativo do servidor é

"scripts": {
    "build":"tsc",
    "start":"tsc & node .",   // this is the command which fails
    "dev":"tsc -w & nodemon ."
  },

Eu sei que tenho que configurar aquele postinstall para que tsc seja reconhecido, mas não consigo entender em qual dos scripts do package.json eu deveria adicioná-lo. Agradeceria se você pudesse esclarecer em qual adicionar e por que tsc não está sendo reconhecido. Alternativamente, posso usar diretamente npx tsc ou isso não é recomendado?

Resposta #1

Eu me deparei com um problema semelhante e não tenho certeza se é o mesmo que você encontrou, mas estou postando de qualquer maneira caso seja útil para outra pessoa.

Estou usando o build pack heroku/nodejs e parece que ele executa as tarefas na seguinte ordem:

  • Criando ambiente de execução
  • ...
  • Instalando dependências
  • Construir
  • Poda de devDependencies
  • ...

Após a conclusão bem-sucedida da compilação, o contêiner é iniciado com o comando npm 'start', que no seu caso chama o comando tsc, que não existe mais se você o instalou como uma dependência de desenvolvimento (já que foi removido).

Minha solução foi mover tsc para fora da etapa de inicialização e deixá-lo como node .