如何使用 pm2 post-deploy 处理部署和构建 Typescript Node.js 项目
How to handle deploying and building a Typescript Node.js project with pm2 post-deploy
我的项目是 Node.js 使用 ESM 用 Typescript 编写的 Express 服务器。
目前我的部署流程如下:
- 运行 使用 pm2
在我的本地机器上部署脚本
- 从 git 仓库中提取最新的更改到 Ubuntu 服务器
- Server 运行s
npm install
并构建 Typescript Node.js 项目
- 运行s 起始脚本在 build/dist 目录
我必须在我的服务器上构建应用程序,因为我没有将我的 /dist
文件夹推送到我的 git 存储库,并且该过程取决于删除和克隆我的存储库的最新版本.
但是由于我使用 production
标志进行部署,它只安装我的依赖项(不是我的 devDependencies)。我不得不将依赖项从 devDependencies 转移过来,这样我的应用程序就可以在服务器上构建而不会出现任何投诉。
例如,我目前想在我的项目中设置 babel,因为我在单元测试 ES 模块时遇到了问题(另一个故事)。但是由于我当前的设置,我需要将所有 babel 依赖项作为常规依赖项而不是 devDependencies 安装。这让我心烦意乱。我似乎找不到适合我的用例的解决方案。
我是否应该将我的构建文件夹推送到我的 git 存储库,这样我就可以 运行 启动文件而无需构建?我不太喜欢推送构建文件夹的想法。
我是否只是继续将一些 devDependencies 作为常规依赖项,以便我可以在我的服务器上正确构建?我真的很想在我的 dev/regular 依赖项之间有一层分隔。现在它变得乱码了。
以下是一些相关的配置文件:
package.json
"scripts": {
"build": "rimraf dist && tsc",
"test": "c8 --all -r html -r text mocha",
"test-watch": "npm run test -- -w",
"dev": "concurrently --kill-others \"tsc -w\" \"pm2-dev start ecosystem.config.cjs\"",
"deploy": "pm2 deploy ecosystem.config.cjs production"
}
ecosystem.config.cjs
apps: [
{
name: 'brobot',
script: 'dist/src/index.js',
node_args: '--experimental-specifier-resolution=node',
env: {
NODE_ENV: 'development'
}
}
],
deploy: {
production: {
user: process.env.AWS_USER,
host: process.env.AWS_PUBLIC_IP,
key: process.env.AWS_SSH_KEY,
ref: 'origin/main',
repo: 'git@github.com:somegitrepo',
path: process.env.AWS_EC2_PATH,
node_args: '--experimental-specifier-resolution=node',
env: {
NODE_ENV: 'production'
},
'post-deploy': 'npm install && npm run build && pm2 startOrRestart ecosystem.config.cjs --env production'
}
}
tsconfig.json
{
"compilerOptions": {
"target": "ES6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */,
"module": "ESNext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */,
"sourceMap": true /* Generates corresponding '.map' file. */,
"outDir": "dist" /* Redirect output structure to the directory. */,
/* Strict Type-Checking Options */
"strict": true /* Enable all strict type-checking options. */,
/* Module Resolution Options */
"moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */,
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
"skipLibCheck": true /* Skip type checking of declaration files. */,
"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
},
"exclude": ["node_modules"]
}
我真的很想在我的项目中保留pm2,它非常有用。我肯定忽略了一些东西,但我不确定如何最好地处理这个 post-部署设置。
发生这种情况是因为您 运行 npm install
和 NODE_ENV=production
。尝试使用 npm install --production=false
安装依赖项,即使在生产环境中也应该强制安装开发依赖项
我的项目是 Node.js 使用 ESM 用 Typescript 编写的 Express 服务器。
目前我的部署流程如下:
- 运行 使用 pm2 在我的本地机器上部署脚本
- 从 git 仓库中提取最新的更改到 Ubuntu 服务器
- Server 运行s
npm install
并构建 Typescript Node.js 项目 - 运行s 起始脚本在 build/dist 目录
我必须在我的服务器上构建应用程序,因为我没有将我的 /dist
文件夹推送到我的 git 存储库,并且该过程取决于删除和克隆我的存储库的最新版本.
但是由于我使用 production
标志进行部署,它只安装我的依赖项(不是我的 devDependencies)。我不得不将依赖项从 devDependencies 转移过来,这样我的应用程序就可以在服务器上构建而不会出现任何投诉。
例如,我目前想在我的项目中设置 babel,因为我在单元测试 ES 模块时遇到了问题(另一个故事)。但是由于我当前的设置,我需要将所有 babel 依赖项作为常规依赖项而不是 devDependencies 安装。这让我心烦意乱。我似乎找不到适合我的用例的解决方案。
我是否应该将我的构建文件夹推送到我的 git 存储库,这样我就可以 运行 启动文件而无需构建?我不太喜欢推送构建文件夹的想法。
我是否只是继续将一些 devDependencies 作为常规依赖项,以便我可以在我的服务器上正确构建?我真的很想在我的 dev/regular 依赖项之间有一层分隔。现在它变得乱码了。
以下是一些相关的配置文件:
package.json
"scripts": {
"build": "rimraf dist && tsc",
"test": "c8 --all -r html -r text mocha",
"test-watch": "npm run test -- -w",
"dev": "concurrently --kill-others \"tsc -w\" \"pm2-dev start ecosystem.config.cjs\"",
"deploy": "pm2 deploy ecosystem.config.cjs production"
}
ecosystem.config.cjs
apps: [
{
name: 'brobot',
script: 'dist/src/index.js',
node_args: '--experimental-specifier-resolution=node',
env: {
NODE_ENV: 'development'
}
}
],
deploy: {
production: {
user: process.env.AWS_USER,
host: process.env.AWS_PUBLIC_IP,
key: process.env.AWS_SSH_KEY,
ref: 'origin/main',
repo: 'git@github.com:somegitrepo',
path: process.env.AWS_EC2_PATH,
node_args: '--experimental-specifier-resolution=node',
env: {
NODE_ENV: 'production'
},
'post-deploy': 'npm install && npm run build && pm2 startOrRestart ecosystem.config.cjs --env production'
}
}
tsconfig.json
{
"compilerOptions": {
"target": "ES6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */,
"module": "ESNext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */,
"sourceMap": true /* Generates corresponding '.map' file. */,
"outDir": "dist" /* Redirect output structure to the directory. */,
/* Strict Type-Checking Options */
"strict": true /* Enable all strict type-checking options. */,
/* Module Resolution Options */
"moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */,
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
"skipLibCheck": true /* Skip type checking of declaration files. */,
"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
},
"exclude": ["node_modules"]
}
我真的很想在我的项目中保留pm2,它非常有用。我肯定忽略了一些东西,但我不确定如何最好地处理这个 post-部署设置。
发生这种情况是因为您 运行 npm install
和 NODE_ENV=production
。尝试使用 npm install --production=false
安装依赖项,即使在生产环境中也应该强制安装开发依赖项