为啥 tsc 不在 Heroku 中运行?

Posted

技术标签:

【中文标题】为啥 tsc 不在 Heroku 中运行?【英文标题】:Why doesn't tsc run in Heroku?为什么 tsc 不在 Heroku 中运行? 【发布时间】:2021-01-28 20:51:24 【问题描述】:

我有一个 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"
  

【问题讨论】:

你混淆了标志的顺序,你应该使用npm --prefix server run tsc @FalseDev 感谢您的回复。我刚刚尝试过,但没有任何区别。 PS 如果标志的顺序很重要,客户端build 文件夹将不会被构建。客户端和服务器文件夹中的依赖项安装也是如此。 把它放在你的构建脚本中而不是post-build,post-build 不允许文件系统修改,并且用于数据库迁移之类的事情 @FalseDev Heroku 文档指出,如果有 heroku-postbuild 脚本,build 脚本将被跳过,postbuild 脚本将运行。我也在构建日志中看到了这一点。在此步骤中创建了client/build 文件夹这一事实也告诉我,在postbuild 脚本中使用这些命令没有问题。总结一下我在这里想说的是,除了tsc 命令之外,它似乎可以正常工作。我还可以提一下,我之前在 postbuild 脚本中使用了 heroku-prebuild 命令,没有任何问题。 【参考方案1】:

我还没有找到解决办法。所以我最终找到了一个解决方法。 如果有人遇到同样的事情,我所做的是在服务器上手动运行tsc 以创建server/dist 文件夹。这不是我正在寻找的解决方案,但它现在有效。

【讨论】:

以上是关于为啥 tsc 不在 Heroku 中运行?的主要内容,如果未能解决你的问题,请参考以下文章

Node 可以运行 .ts 文件,那为啥要使用 tsc 转译成 .js 呢? [复制]

whatsapp 聊天机器人不在 Heroku 中运行

Flask 项目在 PyCharm 上运行,但不在 VS Code 和 Heroku 上

为啥 heroku 在我的路由文件中运行此代码,而该代码只能在开发模式下运行?

为啥我的 Django 应用程序可以在本地运行,但不能在 Heroku 上运行?

peerjs 在 loaclhost 上工作,但不在 heroku 上?