我有一个应用程序,我通过github操作将其部署到heroku
但它不会启动,分别是找不到启动应用程序的编译源。
不幸的是,我是heroku的新手,我找不到可能导致这个问题的原因。
这是我的tsconfig.json
{
"compilerOptions": {
"target": "es2018",
"module": "commonjs",
"outDir": "./lib",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"composite": true,
"experimentalDecorators": true
},
"exclude": [
"test"
]
}
我的package.json有以下脚本(我只添加了对问题很重要的脚本(
"heroku-postbuild": "npm run compile",
"start": "node lib/",
"compile": "shx rm -rf lib/ && tsc"
heroku的ProcFile(自动生成(显示以下内容web npm start
(从仪表板复制(
github动作
- name: Deploy Backend
uses: AkhileshNS/heroku-deploy@v3.12.12
with:
heroku_api_key: ${{secrets.HEROKU_API_KEY}}
heroku_app_name: "the name"
heroku_email: "example@mail.com"
appdir: "./server"
env:
HD_MONOGDB_CONNECTION: ${{ secrets.MONGODB_CONNECTION }}
HD_HOST: ${{ secrets.VUE_APP_BACKEND_URL }}
HD_PORT: ${{ secrets.BACKEND_PORT }}
HD_NODE_ENV: "production"
部署还可以,我可以用heroku-cli查看文件。根据heroku的说法,它也成功地构建了。
但我在日志中看到以下错误
2022-04-12T10:06:46.016367+00:00 app[web.1]: Error: Cannot find module '/app/lib'
2022-04-12T10:06:46.016368+00:00 app[web.1]: at Function.Module._resolveFilename (internal/modules/cjs/loader.js:902:15)
2022-04-12T10:06:46.016368+00:00 app[web.1]: at Function.Module._load (internal/modules/cjs/loader.js:746:27)
2022-04-12T10:06:46.016369+00:00 app[web.1]: at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:75:12)
2022-04-12T10:06:46.016369+00:00 app[web.1]: at internal/main/run_main_module.js:17:47 {
2022-04-12T10:06:46.016370+00:00 app[web.1]: code: 'MODULE_NOT_FOUND',
2022-04-12T10:06:46.016370+00:00 app[web.1]: requireStack: []
2022-04-12T10:06:46.016371+00:00 app[web.1]: }
尽管通过tsconfig告诉node将代码构建/编译到./lib
中,但文件夹并不存在。脚本似乎是从heroku(/app
(中的正确文件夹运行的,因为我可以找到一个tsconfig.tsbuildinfo
文件
编辑:添加了构建日志
-----> Building on the Heroku-20 stack
-----> Using buildpack: heroku/nodejs
-----> Node.js app detected
-----> Creating runtime environment
NPM_CONFIG_LOGLEVEL=error
NODE_VERBOSE=false
NODE_ENV=production
NODE_MODULES_CACHE=true
-----> Installing binaries
engines.node (package.json): ^14.0.0
engines.npm (package.json): >= 3.0.0
Resolving node version ^14.0.0...
Downloading and installing node 14.19.1...
Bootstrapping npm >= 3.0.0 (replacing 6.14.16)...
npm >= 3.0.0 installed
-----> Restoring cache
- node_modules
-----> Installing dependencies
Installing node modules
added 402 packages, and audited 403 packages in 10s
55 packages are looking for funding
run `npm fund` for details
3 high severity vulnerabilities
Some issues need review, and may require choosing
a different dependency.
Run `npm audit` for details.
-----> Build
Running heroku-postbuild
> @tasting-organizer/server@0.4.0 heroku-postbuild
> npm run compile
> @tasting-organizer/server@0.4.0 compile
> shx rm -rf lib/ && tsc
-----> Caching build
- node_modules
-----> Pruning devDependencies
up to date, audited 192 packages in 1s
13 packages are looking for funding
run `npm fund` for details
3 high severity vulnerabilities
Some issues need review, and may require choosing
a different dependency.
Run `npm audit` for details.
-----> Build succeeded!
-----> Discovering process types
Procfile declares types -> (none)
Default types for buildpack -> web
-----> Compressing...
Done: 34.4M
-----> Launching...
Released v7
https://tasting-organizer.herokuapp.com/ deployed to Heroku
如果我在本地运行脚本,一切都会正常工作。
我只是在heroku控制台中手动运行这些步骤
奇怪的是,tsc
没有发出任何东西,但tsc --showConfig
显示了我想要的配置。我不明白为什么它不发射文件。我甚至加了--noEmit false
也没有用。
为什么编译后的文件不在/app/lib/
中?有什么想法吗?
我找到了解决方案,尽管我真的不确定为什么它是解决方案。
- 在
tsconfig.json
中将./lib
添加到exclude
"exclude": [
"test",
"lib"
]
- 在构建之前不要删除
lib
文件夹
在我的情况下,将"compile": "shx rm -rf lib/ && tsc"
更改为"compile": "tsc"
现在它工作了。