atk*_*yla 6 heroku node.js typescript
在本地测试我以前运行:
"build-live": "nodemon --exec ./node_modules/.bin/ts-node -r dotenv/config -- ./index.ts"
Run Code Online (Sandbox Code Playgroud)
然后我想我的Procfile应该是这样的:
web: ./node_modules/.bin/ts-node -- ./index.ts
Run Code Online (Sandbox Code Playgroud)
但它说模块'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
Run Code Online (Sandbox Code Playgroud)
这成功了,但是当实际运行它时,我正在使用的一堆lib得到"找不到模块'......'".
小智 25
或者,您可以将TypeScript编译为postinstall挂钩,并node build/index.js作为唯一的Procfile命令运行:
您package.json应该包含npm install在节点进程启动之前和之后执行的postinstall提示:
"scripts": {
"start": "node build/index.js",
"build": "tsc",
"postinstall": "npm run build"
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以按原样保留Procfile:
web: npm start
Run Code Online (Sandbox Code Playgroud)
Heroku 在此记录了这种"基于部署的构建"方法.
您给Heroku的命令是通过编译index.ts和依赖项以及在index.js处启动节点来启动Web"进程" .根据事物的定时方式,index.js在节点启动时可能存在也可能不存在.
您需要在您想要启动应用程序时编译源代码.例如,网络应该是web: node index.js或类似的.
每个构建过程都是不同的,因此您需要为自己的设置找出答案.但是,假设你有一个经典的设置,你可以推送到git,然后Heroku接收到这个更改并用新的slug更新应用程序.您可以在本地编译并在存储库中包含index.js和任何其他构建输出,以便在Heroku使用的slug中可用.
更好的方法是使用与Heroku集成的构建服务器.在那里进行构建之后,将其配置为将构建结果发送到Heroku.特拉维斯有这样一个直截了当的设置.这样,您就不需要在存储库中包含构建输出,这被视为反模式.
在sidenode上,尝试使用a tsconfig.json来保持tsc配置.它将使您不必在整个地方编写如此长的命令行.
小智 7
Fabian 说我们可以这样做:
"scripts": {
"start": "node build/index.js",
"build": "tsc",
"postinstall": "npm run build"
}
Run Code Online (Sandbox Code Playgroud)
在我写这篇文章的时候,我测试了这个并且可以声明:postinstall不需要,因为构建脚本是由 Heroku 运行的。如果您想在没有构建脚本的情况下执行此操作,则可以使用 heroku-postbuild,它将在安装依赖项后运行tsc以进行编译。
| 归档时间: |
|
| 查看次数: |
7269 次 |
| 最近记录: |