如何使用 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 服务器。

目前我的部署流程如下:

我必须在我的服务器上构建应用程序,因为我没有将我的 /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 installNODE_ENV=production。尝试使用 npm install --production=false 安装依赖项,即使在生产环境中也应该强制安装开发依赖项