Vue項目使用ssh2-sftp-client實現打包自動上傳到服務器(完整教程)

告別手動拖拽上傳!本教程將手把手教你如何通過ssh2-sftp-client實現Vue項目打包后自動上傳到服務器,提升部署效率300%。🚀

一、需求場景與解決方案

在Vue項目開發中,每次執行npm run build后都需要手動將dist目錄上傳到服務器,既耗時又容易出錯。通過ssh2-sftp-client庫,我們可以實現:

  1. 打包完成后自動上傳文件到服務器
  2. 支持覆蓋更新和增量上傳
  3. 保留文件權限和目錄結構
  4. 部署過程可視化(進度條顯示)

二、環境準備

確保你的開發環境已安裝:

  • Node.js 14+
  • Vue CLI創建的項目
  • 服務器SSH連接信息(IP、用戶名、密碼/密鑰

三、安裝依賴

安裝核心庫和進度顯示工具:

npm install ssh2-sftp-client progress --save-dev
npm install  chalk --save-dev# 或
yarn add ssh2-sftp-client progress -D

?四、安裝依賴

配置package.json

  "scripts": {"dev": "vite --mode development","look": "vite --mode production","build": "vite build --mode production","preview": "vite --mode production","deploy": "node deploy.js","build:deploy": "npm run build && npm run deploy"},

? 五、核心代碼

在根目錄上新建deploy.js 文件

import Client from 'ssh2-sftp-client';
import path from 'path';
import { fileURLToPath } from 'url';
import fs from 'fs/promises';
import chalk from 'chalk';const server = {host: '',port: 22,username: '',password: '',remoteRoot: '/www/wwwroot'
};// 使用chalk定義顏色主題
const colors = {header: chalk.cyan.bold,success: chalk.green.bold,warning: chalk.yellow.bold,error: chalk.red.bold,file: chalk.blue,progress: chalk.magenta
};const __dirname = path.dirname(fileURLToPath(import.meta.url));
const localPath = path.resolve(__dirname, 'dist');const sftp = new Client();console.log(colors.header('🚀 開始部署操作'));
console.log(colors.header('===================='));
console.log(colors.header(`📡 連接 ${server.username}@${server.host}:${server.port}`));
console.log(colors.header(`📁 本地目錄: ${localPath}`));
console.log(colors.header(`🌐 遠程目錄: ${server.remoteRoot}`));
console.log(colors.header('====================\n'));// 遞歸計算文件總數
async function getTotalFiles(dir) {const entries = await fs.readdir(dir, { withFileTypes: true });let count = 0;for (const entry of entries) {const fullPath = path.join(dir, entry.name);if (entry.isDirectory()) {count += await getTotalFiles(fullPath);} else if (entry.isFile() && !entry.name.includes('.DS_Store')) {count++;}}return count;
}sftp.connect({host: server.host,port: server.port,username: server.username,password: server.password,tryKeyboard: true
}).then(async () => {console.log(colors.success('🔑 認證成功,開始掃描本地文件...'));const totalFiles = await getTotalFiles(localPath);if (totalFiles === 0) {console.log(colors.warning('??  警告: 本地目錄為空,沒有文件需要上傳'));await sftp.end();return;}console.log(colors.success(`📊 發現 ${totalFiles} 個文件需要上傳\n`));console.log(colors.header('🚚 開始上傳文件:'));console.log(colors.header('------------------------------------'));let uploadedCount = 0;return sftp.uploadDir(localPath, server.remoteRoot, {ticker: (localFile) => {uploadedCount++;const relativePath = path.relative(localPath, localFile);const progress = Math.round((uploadedCount / totalFiles) * 100);console.log(colors.progress(`[${uploadedCount.toString().padStart(3, ' ')}/${totalFiles}]`) +colors.file(` ${relativePath}`) +colors.progress(` (${progress}%)`));},filter: f => !f.includes('.DS_Store')});}).then(() => {console.log('\n' + colors.success('? 所有文件上傳完成!'));console.log(colors.success('🏁 部署成功'));sftp.end();}).catch(err => {console.error('\n' + colors.error('? 嚴重錯誤: ' + err.message));console.error(colors.error('🔍 失敗原因分析:'));if (err.message.includes('connect')) {console.error(colors.error('- 無法連接到服務器,請檢查網絡'));console.error(colors.error('- 防火墻設置可能阻止了連接'));console.error(colors.error('- 服務器可能未運行SSH服務'));} else if (err.message.includes('Authentication')) {console.error(colors.error('- 用戶名或密碼錯誤'));console.error(colors.error('- 服務器可能禁用了密碼登錄'));console.error(colors.error('- 嘗試使用SSH密鑰認證'));} else if (err.message.includes('No such file')) {console.error(colors.error('- 本地文件不存在或路徑錯誤'));console.error(colors.error('- 檢查本地dist目錄是否存在'));}console.error('\n' + colors.error('🛠? 診斷命令:'));console.error(colors.error(`telnet ${server.host} ${server.port}`));console.error(colors.error(`ssh ${server.username}@${server.host}`));if (sftp) sftp.end();process.exit(1);});

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91761.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91761.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91761.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《質光相濟:Three.js中3D視覺的底層交互邏輯》

在Three.js搭建的虛擬維度中,光照與材質的關系遠非技術參數的簡單疊加,當光線以數字形態穿越虛空,與物體表面相遇的瞬間,便開始書寫屬于這個世界的物理敘事——每一縷光斑的形狀、每一塊陰影的濃淡、每一寸肌理的反光,都是對現實光學規律的轉譯與重構。理解這種交互的深層…

無刷電機在汽車領域的應用與驅動編程技術

文章目錄引言一、核心應用場景1. 新能源汽車動力系統2. 底盤控制系統3. 車身與舒適系統4. 智能駕駛與安全系統二、無刷電機的技術優勢解析三、無刷電機驅動編程基礎1. 驅動原理2. 驅動架構四、核心控制算法與實現1. 六步換向法(梯形波控制)算法流程圖C語…

【游戲引擎之路】登神長階(十八):3天制作Galgame引擎《Galplayer》——無敵之道心

游戲引擎開發記錄:2024年 5月20日-6月4日:攻克2D物理引擎。 2024年 6月4日-6月13日:攻克《3D數學基礎》。 2024年 6月13日-6月20日:攻克《3D圖形教程》。 2024年 6月21日-6月22日:攻克《Raycasting游戲教程》。 2024年…

kotlin kmp 跨平臺環境使用sqldelight

歡迎訪問我的主頁: https://heeheeaii.github.io/ 1. 項目結構 SQLDelightKMPDemo/ ├── shared/ │ ├── src/ │ │ ├── commonMain/kotlin/ │ │ ├── androidMain/kotlin/ │ │ ├── desktopMain/kotlin/ │ │ └── commonMain/sqldel…

機器學習【五】decision_making tree

決策樹是一種通過樹形結構進行數據分類或回歸的直觀算法,其核心是通過層級決策路徑模擬規則推理。主要算法包括:ID3算法基于信息熵和信息增益選擇劃分屬性;C4.5算法改進ID3,引入增益率和剪枝技術解決多值特征偏差;CART…

簡單記錄一下VSCode中的一些學習記

在剛開始學習VSCode時,相信大家都會好奇VSCode底部區域那幾個不同的狀態欄具體有什么作用(輸出、調試控制臺、終端、端口),貌似好像都是輸出與代碼相關的信息的?貌似代碼運行結果既可以出現在輸出中,也可以…

基于 Hadoop 生態圈的數據倉庫實踐 —— OLAP 與數據可視化(二)

目錄 二、Hive、SparkSQL、Impala 比較 1. SparkSQL 簡介 2. Hive、SparkSQL、Impala 比較 (1)功能 (2)架構 (3)場景 3. Hive、SparkSQL、Impala 性能對比 (1)cloudera 公司…

C++:std::array vs 原生數組 vs std::vector

📌 C:std::array vs 原生數組 vs std::vector 引用: C/C 標準庫 std::vector、std::array、原生靜態數組 的區別有哪些? 深度剖析:std::vector 內存機制與 push_back 擴容策略 今天過去了 還有許許多個明天 能和大…

Hyper-V + Centos stream 9 搭建K8s集群(二)

一、安裝自動補全主節點安裝就可以yum install -y bash-completion echo source <(kubectl completion bash) >>~/.bashrc kubectl completion bash >/etc/bash_completion.d/kubectl二、安裝Calico網絡插件&#xff08;主節點&#xff09;下載文件wget https://ca…

VBA代碼解決方案第二十七講:禁用EXCEL工作簿右上角的關閉按鈕

《VBA代碼解決方案》(版權10028096)這套教程是我最早推出的教程&#xff0c;目前已經是第三版修訂了。這套教程定位于入門后的提高&#xff0c;在學習這套教程過程中&#xff0c;側重點是要理解及掌握我的“積木編程”思想。要靈活運用教程中的實例像搭積木一樣把自己喜歡的代碼…

Spring AI 系列之三十一 - Spring AI Alibaba-基于Nacos的MCP

之前做個幾個大模型的應用&#xff0c;都是使用Python語言&#xff0c;后來有一個項目使用了Java&#xff0c;并使用了Spring AI框架。隨著Spring AI不斷地完善&#xff0c;最近它發布了1.0正式版&#xff0c;意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說…

sqli-labs:Less-12關卡詳細解析

1. 思路&#x1f680; 本關的SQL語句為&#xff1a; $uname".$uname."; $passwd".$passwd."; $sql"SELECT username, password FROM users WHERE username($uname) and password($passwd) LIMIT 0,1";注入類型&#xff1a;字符串型&#xff0…

【SpringAI】8.通過json動態添加mcp服務

前言 官方示例的代碼中&#xff0c;mcp一般是配置到yml中或者json文件中&#xff0c;使用自動裝配的方式注入服務&#xff0c;這種方式不方便在程序啟動后添加新的服務&#xff0c;這里參考cherry studio的方式動態添加mcp服務 1.確定方案 mcp服務的維護放到mysql業務數據庫維…

【PDF + ZIP 合并器:把ZIP文件打包至PDF文件中】

B站鏈接 PDF ZIP 合并器&#xff1a;把ZIP文件打包至PDF文件中_嗶哩嗶哩_bilibiliz 加強作者的工具 https://wwgw.lanzn.com/i8h1C32k9bef 密碼:30cv 新增c框架&#xff0c;加快運行速度

阿里云部署微調chatglm3

git Ifs install Git lfs 主要用于管理大型文件。在傳統的Git倉庫中&#xff0c;所有文件內容都會被完整記錄在每一次提交中&#xff0c;這會導致倉庫體積增大&#xff0c;克隆、拉取和推送操作變慢&#xff0c;甚至可能超出存儲限額。Git LFS通過將大文件替換成文本指針&#…

Linux網絡編程 ---五種IO模型

五種IO模型一、IO慢的原因二、五種IO模型三、如何設置非阻塞式IO&#xff1f;一、IO慢的原因 二、五種IO模型 阻塞式IO 非阻塞式IO 信號驅動IO 多路轉接 異步IO 三、如何設置非阻塞式IO&#xff1f; &#xff08;一&#xff09;用法說明 &#xff08;二&#xff0…

Obsidian結合CI/CD實現自動發布

CI/CDQuickAddJS腳本bat腳本sh腳本實現自動發版Hugo文章 需求來源 每次手動執行Hugo的命令&#xff0c;手動把public文件夾上傳到自己的服務器可以完成發版需求。 但是&#xff0c;作為一個內容創作者&#xff0c;我更希望的關注于自己的內容&#xff0c;而不是關注整個發版…

[硬件電路-141]:模擬電路 - 源電路,信號源與電源,能自己產生確定性波形的電路。

源電路&#xff08;Source Circuit&#xff09;是電子系統中為其他電路或負載提供特定信號或能量的基礎電路模塊&#xff0c;其核心功能是生成、調節或轉換所需的物理量&#xff08;如電壓、電流、波形、頻率等&#xff09;。以下是源電路的詳細解析&#xff1a;一、源電路的核…

Unity_數據持久化_PlayerPrefs基礎

Unity數據持久化 一、數據持久化基礎概念 1.1 什么是數據持久化 定義&#xff1a; 數據持久化就是將內存中的數據模型轉換為存儲模型&#xff0c;以及將存儲模型轉換為內存中的數據模型的統稱。 通俗解釋&#xff1a; 將游戲數據存儲到硬盤&#xff0c;硬盤中數據讀取到游戲中&…

什么是列存儲(Columnar Storage)?深度解析其原理與應用場景

列存儲的基本概念&#xff1a;顛覆傳統的數據組織方式列存儲&#xff08;Column Storage&#xff09;是一種革命性的數據庫存儲技術&#xff0c;它通過按列而非按行組織數據&#xff0c;從根本上改變了數據的物理存儲結構。與傳統行存儲數據庫不同&#xff0c;列式數據庫將每一…