在本地测试时我以前在运行:
"build-live": "nodemon --exec ./node_modules/.bin/ts-node -r dotenv/config -- ./index.ts"
然后我认为我的Procfile应该是这样的:
web: ./node_modules/.bin/ts-node -- ./index.ts
但它表示找不到模块'typescript',即使它在package.json
中也是如此。我在一些地方读到ts-node
不是部署到Heroku的方式,所以我不知道该怎么做。
更新:我想我应该编译它,所以我尝试了:
web: ./node_modules/.bin/tsc --module commonjs --allowJs --outDir build/ --sourceMap --target es6 index.ts && node build/index.js
这成功了,但是当实际运行它时,我正在使用的一堆lib得到“找不到模块'......'”。
答案 0 :(得分:19)
或者,您可以将TypeScript编译为postinstall挂钩并运行node build/index.js
作为唯一的Procfile命令:
您的package.json
应包含在npm install
之后和节点进程启动之前执行的postinstall提示:
"scripts": {
"start": "node build/index.js",
"build": "tsc",
"postinstall": "npm run build"
}
然后您可以按原样保留Procfile:
web: npm start
这种“基于部署的构建”方法由Heroku here记录。
答案 1 :(得分:6)
您给Heroku的命令是通过在index.js编译index.ts和依赖和起始节点来启动Web“进程”。根据事物的定时方式,index.js在节点启动时可能存在也可能不存在。
您需要在您想要启动应用程序时编译源代码。例如,网络应该只是web: node index.js
或类似。
每个构建过程都不同,因此您需要为自己的设置找出答案。但是,假设你有一个经典的设置,你可以推送到git,然后Heroku接收到这个更改并使用新的slug更新应用程序。您可以在本地编译并在存储库中包含index.js和任何其他构建输出,以便在Heroku使用的slug中可用。
更好的方法是使用与Heroku集成的构建服务器。在那里进行构建之后,将其配置为将构建结果发送到Heroku。 Travis有这样简单的设置。这样,您就不需要在存储库中包含构建输出,这被视为反模式。
在sidenode上,尝试使用tsconfig.json
来保持tsc配置。它将使您不必在整个地方编写如此长的命令行。
答案 2 :(得分:0)
Fabian说我们可以做类似的事情:
"scripts": {
"start": "node build/index.js",
"build": "tsc",
"postinstall": "npm run build"
}
在撰写本文时,我对此进行了测试,并可以指出:postinstall
不是必需的,因为构建脚本是由Heroku运行的。如果要在不使用构建脚本的情况下执行此操作,则可以使用heroku-postbuild,它将在安装依赖项之后运行,运行tsc
进行编译。
答案 3 :(得分:0)
我的问题是关于缺少Typescript npm模块。将应用程序部署到Heroku时找不到Typescript编译器tsc
。
Heroku部署过程(正确地)没有安装开发依赖项,在我的情况下,Typescript模块是devDependencies的一部分,因此tsc
命令未在Heroku平台上运行。
将typescript
添加到依赖项:npm i typescript -s
npm i typescript && npm run tsc
答案 4 :(得分:0)
您可以将打字稿从 devDependencies 移至依赖项。
答案 5 :(得分:-1)
在我的例子中,我从“devDependencies”删除了一些依赖到“dependencies”,所以它是这样的:
"dependencies": {
// The other dependencies goes here, I don't touch them.
// But all TS dependencies I remove to here.
"ts-node": "^9.1.1",
"tsconfig-paths": "^3.9.0",
"typescript": "^4.2.3",
"ts-loader": "^8.0.18"
},