为什么 Heroku 中没有 tsc 运行?
Why doesn't tsc run in Heroku?
我有一个 React Express TypeScript 应用程序,我一直在努力将其部署到 Heroku。目的是在不手动创建客户端 build
(React 脚本)和服务器 dist
(tsc) 文件夹的情况下部署应用程序,即这些文件夹应该在 Heroku 部署期间构建。目前,build
文件夹已成功构建,但未成功构建 dist
文件夹。我通过 运行 在 bash 模式下部署的应用程序并浏览文件夹仔细检查了这一点。似乎 tsc 在服务器端没有 运行,但在部署期间没有关于此的警告或错误。
为了提供一些概述,我有以下文件夹结构(为简洁起见,省略了许多文件夹和文件):
|-- client
| |-- public
| |-- src
| |-- package.json
| '-- tsconfig.json
|-- server
| |-- dist <-- **THIS FOLDER DOES NOT BUILD DURING DEPLOYMENT**
| |-- src
| |-- package.json
| '-- tsconfig.json
'-- package.json
我的 package.json
文件(在根文件夹中)如下所示:
{
... ,
"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"
}
}
...server/tsconfig.json
文件如下所示:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"outDir": "dist",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
},
"exclude": [
"dist",
"node_modules"
],
"include": [
"src"
]
}
我的理解是 heroku-postbuild
中的 npm run tsc --prefix server
应该可以解决问题,但事实并非如此。我可能在这里遗漏了一些东西。也许我的文件夹结构不正确,但我觉得部署应用程序应该不是问题。
如果能得到任何帮助或指向正确方向的指示,我将不胜感激。
编辑:
我还应该提到 TypeScript 已作为依赖项添加到 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"
}
}
我还没有找到解决办法。所以我最终找到了解决方法。
如果有人遇到同样的问题,我所做的是在服务器上手动 运行 tsc
以创建 server/dist
文件夹。这不是我正在寻找的解决方案,但它现在有效。
我在 package.json
"scripts": {
....//your commands
"tsc": "./node_modules/typescript/bin/tsc",
....//your commands
},
它将 运行 来自本地 Typescript 的本地 'tsc' 命令 node_modules。
PS:我将 Typescript 安装为 devDependencies(npm i -D typescript)
我有一个 React Express TypeScript 应用程序,我一直在努力将其部署到 Heroku。目的是在不手动创建客户端 build
(React 脚本)和服务器 dist
(tsc) 文件夹的情况下部署应用程序,即这些文件夹应该在 Heroku 部署期间构建。目前,build
文件夹已成功构建,但未成功构建 dist
文件夹。我通过 运行 在 bash 模式下部署的应用程序并浏览文件夹仔细检查了这一点。似乎 tsc 在服务器端没有 运行,但在部署期间没有关于此的警告或错误。
为了提供一些概述,我有以下文件夹结构(为简洁起见,省略了许多文件夹和文件):
|-- client
| |-- public
| |-- src
| |-- package.json
| '-- tsconfig.json
|-- server
| |-- dist <-- **THIS FOLDER DOES NOT BUILD DURING DEPLOYMENT**
| |-- src
| |-- package.json
| '-- tsconfig.json
'-- package.json
我的 package.json
文件(在根文件夹中)如下所示:
{
... ,
"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"
}
}
...server/tsconfig.json
文件如下所示:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"outDir": "dist",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
},
"exclude": [
"dist",
"node_modules"
],
"include": [
"src"
]
}
我的理解是 heroku-postbuild
中的 npm run tsc --prefix server
应该可以解决问题,但事实并非如此。我可能在这里遗漏了一些东西。也许我的文件夹结构不正确,但我觉得部署应用程序应该不是问题。
如果能得到任何帮助或指向正确方向的指示,我将不胜感激。
编辑:
我还应该提到 TypeScript 已作为依赖项添加到 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"
}
}
我还没有找到解决办法。所以我最终找到了解决方法。
如果有人遇到同样的问题,我所做的是在服务器上手动 运行 tsc
以创建 server/dist
文件夹。这不是我正在寻找的解决方案,但它现在有效。
我在 package.json
"scripts": {
....//your commands
"tsc": "./node_modules/typescript/bin/tsc",
....//your commands
},
它将 运行 来自本地 Typescript 的本地 'tsc' 命令 node_modules。
PS:我将 Typescript 安装为 devDependencies(npm i -D typescript)