在 Nuxt.js 項目中,咱們有一個全局的環境變量 process.env.NODE_ENV,默認狀況下,這個變量的值要麼是 production,要麼是 development,分別表示生產環境和開發環境。而若是咱們使用 pm2 來部署咱們的項目,咱們須要的環境可能不止這兩種,咱們還須要測試環境、預生產環境等等。這時候,就須要作一些配置工做才能正常使用,本篇文章就記錄一下如何在 Nuxt 項目中給 pm2 配置生產環境和測試環境。git
若是要使用 pm2 來部署咱們的項目,首先須要在項目根目錄中建立一個名爲 ecosystem.config.js 的生態系統配置文件,這個文件導出一個對象,這個對象包含兩部分:apps 和 deploy。其中 apps 是一個數組,包含咱們須要部署的項目信息,通常這個數組只有一個對象,咱們在一個生態系統配置文件裏只部署一個項目。而 deploy 是一個對象,包含一些項目部署到服務器所需的配置。npm
module.exports = { apps: [{}, {}], deploy: {} }
假設咱們要部署的項目名稱爲 mydemo,項目總共有三個環境,生產環境 production,測試環境 test,開發環境 development,其中要使用 pm2 部署 production 和 test 兩個環境(development 環境只在咱們本地開發調試的時候使用,而不用部署)。那麼咱們的 ecosystem.config.js 文件應該這樣寫:json
module.exports = { apps: [ { name: 'mydemo', script: 'start.js', env: { COMMON_VARIABLE: 'true' }, env_production: { NODE_ENV: 'production' }, env_test: { NODE_ENV: 'test' } } ], deploy: { production: { user: '你的服務器登陸名', host: ['你的服務器 IP'], port: '你的服務器登陸端口,默認 22', ref: 'origin/master', repo: '你的 git 倉庫地址', path: '/www/mydemo/production', ssh_options: 'StrictHostKeyChecking=no', 'post-deploy': 'yarn install && npm run build && pm2 startOrRestart ecosystem.config.js --env production' }, test: { user: '你的服務器登陸名', host: ['你的服務器 IP'], port: '你的服務器登陸端口,默認 22', ref: 'origin/test', repo: '你的 git 倉庫地址', path: '/www/mydemo/test', ssh_options: 'StrictHostKeyChecking=no', 'post-deploy': 'yarn install && npm run build && pm2 startOrRestart ecosystem.config.js --env test' } } }
能夠看到,在 apps 數組的第一個對象中,咱們有項目名稱,項目入口,以及兩個環境,一個是生產環境 env_production,裏面 NODE_ENV 的值爲 production,另外一個是測試環境 env_test,裏面 NODE_ENV 的值爲 test。在 deploy 中,咱們有兩個對象,一個是 production,裏面是部署生產環境用到的配置,其中 ref 要使用咱們項目在 git 倉庫的生產分支,path 是咱們的生產代碼在服務器上存儲的路徑,post-deploy 中最後指定 --env production
表示咱們會用到 apps 中 env_production 的配置。另外一個是 test,裏面是部署測試環境用到的配置,其中 ref 要使用咱們項目在 git 倉庫的測試分支,path 是咱們的測試代碼在服務器上存儲的路徑,post-deploy 中最後指定 --env test
表示咱們會用到 apps 中 env_test 的配置。數組
寫好了 pm2 的生態系統配置文件 ecosystem.config.js,還有一個很重要的地方也要修改,那就是 nuxt.config.js,這個文件是 nuxt 項目的配置文件。咱們須要在裏面添加一個對象 env,而後在這個對象裏面添加名爲 NODE_ENV 的字段,字段的值爲 process.env.NODE_ENV。這樣,咱們在程序裏面經過 process.env.NODE_ENV 就能獲取當前環境是生產環境仍是測試環境。若是不寫這個的話,即便咱們在 ecosystem.config.js 的 env_test 裏面配置了測試環境的 NODE_ENV 爲 test,咱們在代碼裏面獲取到的仍然是 development,而不是 test(默認只有 production 和 development,非 production 的一概按 development 處理)。服務器
module.exports = { env: { NODE_ENV: process.env.NODE_ENV } }
當咱們把這些配置都寫好以後,咱們就能夠經過 pm2 deploy ecosystem.config.js production
命令來部署生產環境,經過 pm2 deploy ecosystem.config.js test
命令來部署測試環境。這兩句命令裏面的 production 和 test 指的是 ecosystem.config.js 中 deploy 裏面的 production 對象和 test 對象,而 post-deploy 裏面的 production 和 test 指的是 apps 裏面的 env_production 和 env_test,注意不要混淆。app
爲了方便部署,咱們一般在 package.json 文件的 scripts 裏面添加兩句命令來指代上面的部署命令,這樣當咱們要部署生產服務時咱們只須要輸入 npm run prd
,當咱們要部署測試服務時咱們只須要輸入 npm run test
。ssh
"scripts": { "prd": "pm2 deploy ecosystem.config.js production", "test": "pm2 deploy ecosystem.config.js test" }
就在你覺得萬事大吉,大功告成的時候,你會發現你無法同時在一臺服務器上部署生產環境和測試環境。當你使用 npm run prd
部署好生產服務後,你服務器上的 pm2 會有一個名爲 mydemo 的進程。當你使用 npm run test
部署完測試服務後,你服務器上的 pm2 的進程仍是隻有一個 mydemo,雖然名字相同,但其實它如今已是你測試環境的服務了。因爲名字相同,因此每次它都會替換以前的服務,而不會共存。那麼爲了可讓生產服務和測試服務同時運行,咱們還須要在 ecosystem.config.js 的 apps 的對象裏面添加一句 append_env_to_name: true
,這表示會把當前環境的名字跟在咱們進程的名字後面,最後當咱們使用 npm run prd
部署完生產服務後,會發現咱們生產服務的名字爲 mydemo-production,當咱們使用 npm run test
部署完測試服務後,會發現咱們測試服務的名字爲 mydemo-test,這樣就可讓一個項目的生產環境和測試環境同時運行在一個服務器上了。ide
module.exports = { apps: [ { name: 'mydemo', script: 'start.js', append_env_to_name: true, env: { COMMON_VARIABLE: 'true' }, env_production: { NODE_ENV: 'production' }, env_test: { NODE_ENV: 'test' } } ], deploy: {} }
以上就是在一個 Nuxt 項目中給 pm2 配置生產環境和測試環境的過程,最後,經過公衆號「極課助手」去購買「極客時間」全部課程,能夠得到高額返現,最高可返 51 元,若是想了解更多技術知識,能夠關注「極課助手」公衆號。post
(正文完)測試
參考文獻: