typescript - ¿Por qué no se ejecuta tsc en Heroku?
Tengo una aplicación de React Express TypeScript que me ha costado desplegar en Heroku. El objetivo es desplegar la aplicación sin crear manualmente las carpetas build del cliente (script de React) y dist del servidor (tsc), es decir, esas carpetas deberían construirse durante el despliegue en Heroku. En este momento, la carpeta build se construye correctamente, pero no la carpeta dist. Lo he verificado ejecutando la aplicación desplegada en modo bash y revisando las carpetas. Parece que tsc no se ejecuta en el lado del servidor, pero no hay advertencias ni errores al respecto durante el despliegue.
Para dar una visión general, tengo la siguiente estructura de carpetas (muchas carpetas y archivos se han omitido por brevedad):
|-- client
| |-- public
| |-- src
| |-- package.json
| '-- tsconfig.json
|-- server
| |-- dist <-- **THIS FOLDER DOES NOT BUILD DURING DEPLOYMENT**
| |-- src
| |-- package.json
| '-- tsconfig.json
'-- package.json
Mi archivo package.json (en la carpeta raíz) se ve así:
{
... ,
"scripts": {
"start": "node server/dist/index.js",
"tsc": "tsc",
"build": "react-scripts build",
"heroku-prebuild": "npm install --prefix server && npm install --prefix client",
"heroku-postbuild": "NPM_CONFIG_PRODUCTION=false && NODE_ENV=production && npm run tsc --prefix server && npm run build --prefix client"
},
... ,
"engines": {
"node": "12.13.1",
"npm": "6.12.1"
}
}
...y el archivo server/tsconfig.json se ve así:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"outDir": "dist",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
},
"exclude": [
"dist",
"node_modules"
],
"include": [
"src"
]
}
Mi entendimiento es que npm run tsc --prefix server en heroku-postbuild debería funcionar, pero no lo hace. Probablemente estoy pasando algo por alto aquí. Tal vez mi estructura de carpetas no sea correcta, pero siento que eso no debería ser un problema para desplegar la aplicación.
Estaría agradecido de recibir cualquier ayuda o indicación en la dirección correcta.
Editar: También debería mencionar que TypeScript se ha añadido como una dependencia en server/package.json:
{
...,
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^4.2.0",
"eslint": "^7.9.0",
"eslint-config-airbnb-base": "^14.2.0",
"eslint-plugin-import": "^2.22.0",
"nodemon": "^2.0.4"
},
"dependencies": {
"@types/chai": "^4.2.13",
"@types/express": "^4.17.8",
"@types/jest": "^26.0.14",
"@types/socket.io": "^2.1.11",
"@types/socket.io-client": "^1.4.34",
"@types/supertest": "^2.0.10",
"@typescript-eslint/parser": "^4.4.1",
"body-parser": "^1.19.0",
"chai": "^4.2.0",
"express": "^4.17.1",
"jest": "^26.5.3",
"socket.io": "^2.3.0",
"socket.io-client": "^2.3.1",
"supertest": "^5.0.0",
"ts-jest": "^26.4.1",
"typescript": "^4.0.3"
}
}
Respuesta #1
Todavía no he logrado encontrar una solución. Así que terminé usando una solución alternativa. En caso de que alguien esté lidiando con lo mismo, lo que hice fue ejecutar tsc manualmente en el servidor para crear la carpeta server/dist. No es la solución que estaba buscando, pero funciona por ahora.
Respuesta #2
Hice esto en package.json
"scripts": {
....//your commands
"tsc": "./node_modules/typescript/bin/tsc",
....//your commands
},
Ejecutará el comando local 'tsc' desde Typescript local dentro de node_modules.
PD: Instalé Typescript como devDependencies (npm i -D typescript)
