用腳本實現連接服務器進行文件傳輸過程,保證打包后能夠運行腳本自動化上傳文件,打包部署命令為:npm run build:deploy
腳本實現原理:
利用node中ssh進行文件傳輸,前提是需要連通服務器以及服務器開啟ssh。腳本實現過程分兩步:
- 連接遠程服務器,并修改服務器dist文件名稱
// 安裝node-ssh包
const { NodeSSH } = require('node-ssh')
async function main() {
const ssh = new NodeSSH()
// 獲取當前日期
const currentDate = new Date().toISOString().split('T')[0]
// 新dist文件名
const newDistName = `dist-${currentDate}`
// 舊dist文件名
const oldDistName = 'dist'
try {
// 連接遠程服務器
await ssh.connect({
host: 'xxx.xxx.xxx.xxx',
username: '用戶名',
password: '密碼'
})
// 判斷服務器dist文件是否存在
let i = 1
let newDistExists = await ssh.execCommand(`ls /nginx/${newDistName}-${i}`)
while(newDistExists.code === 0) {
i ++
newDistExits = await ssh.execCommand(`ls /nginx/${newDistName}-${i}`)
}
// 重命名舊的dist文件
await ssh.execCommand(`mv /nginx/${oldDistName} /nginx/${newDistName}-${i}`)
console.log('遠程服務器操作成功!')
} catch(error) {
console.error('遠程服務器操作失敗:', error)
ssh.dispose()
return
}
}
- 上傳新dist文件
try {
// 上傳dist目錄到nginx服務器
await ssh.putDirectory(oldDistName, '/nginx/dist/', {
recursive: true,
concurrency: 10,
tick(localPath, remotePath, error) {
if(error) {
console.log(`無法上傳${localPath}到${remotePath}: ${error}`)
} else {
console.log(`${localPath}上傳至${remotePath}`)
}
}
})
console.log('dist目錄上傳成功!')
} catch(error) {
console.error('上傳dist目錄失敗:', error)
}
// 斷開ssh連接
ssh.dispose()
main()
由于通過ssh.connect連接服務器,可能存在安全風險,此種方式安全性有待考證!
其中服務器信息采用password-prompt插件,將用戶名密碼采用terminal終端窗口輸入,同時不保存輸入記錄
const passwordPrompt = require('password-prompt')
const getUsernameAndPassword = async() => {
const username = await passwordPrompt('Enter your username:')
const password = await passwordPrompt('Enter your password:', { method: 'hide' })
return { username, password }
}
將輸入的username、password輸入到遠程服務器即可