用 Node.js 構建模塊化的 CLI 腳手架工具,從 GitHub 下載遠程模板

在這里插入圖片描述


本文將手把手帶你構建一個支持遠程模板下載、自定義項目名稱,并完成模塊化拆分的 CLI 腳手架工具,適用于初創項目、團隊內部工具或者開源項目快速初始化。


🧩 為什么要自己造一個 CLI 腳手架?

在日常開發中,我們常用腳手架如 create-react-appvue-cli 來初始化項目,它們幫我們完成繁瑣的初始化配置。如果你:

  • 想統一團隊的項目初始化結構;
  • 想搭建自己的模板體系;
  • 想通過命令行一鍵拉取模板代碼;

那自定義腳手架就是你的不二選擇!


📦 項目結構設計(模塊化)

我們先設計一套清晰的目錄結構,便于后續拓展和維護:

my-cli/
├── bin/
│   └── my-cli.js          # CLI 命令入口
├── lib/
│   ├── init.js            # 初始化流程調度
│   ├── download.js        # 模板下載邏輯
│   ├── log.js             # 統一日志封裝
│   └── repo.js            # 倉庫地址統一管理
├── package.json

🛠? 核心依賴庫說明

庫名用途描述
commanderCLI 命令行參數解析
download-git-repo支持 GitHub/Gitee 等倉庫模板下載
ora終端加載動畫
chalk控制臺美化輸出
inquirer(可選)增強交互體驗,如模板選擇

🧱 一步步構建 CLI 工具

Step 1??:初始化并安裝依賴

mkdir my-cli && cd my-cli
npm init -ynpm install commander download-git-repo ora chalk

Step 2??:編寫命令入口 bin/my-cli.js

#!/usr/bin/env node
const { program } = require('commander');
const init = require('../lib/init');program.version('1.0.0').command('init <projectName>').description('初始化一個項目模板').action((projectName) => {init(projectName);});program.parse(process.argv);

別忘了給該文件執行權限:chmod +x bin/my-cli.js
并在 package.json 添加:

"bin": {"my-cli": "./bin/my-cli.js"
}

Step 3??:編寫模板下載邏輯 lib/download.js

const download = require('download-git-repo');
const ora = require('ora');
const { error, success } = require('./log');function downloadTemplate(repo, dest) {const spinner = ora('📦 正在下載模板...').start();return new Promise((resolve, reject) => {download(repo, dest, { clone: false }, (err) => {if (err) {spinner.fail('? 下載失敗');error(err);reject(err);} else {spinner.succeed('? 下載成功');resolve();}});});
}module.exports = downloadTemplate;

Step 4??:統一日志輸出 lib/log.js

const chalk = require('chalk');exports.success = (msg) => console.log(chalk.green(msg));
exports.error = (msg) => console.log(chalk.red(msg));
exports.info = (msg) => console.log(chalk.blue(msg));

Step 5??:管理模板倉庫地址 lib/repo.js

module.exports = {vue: 'github:yourname/vue-template',react: 'github:yourname/react-template',default: 'github:yourname/base-template'
};

你可以拓展為支持 inquirer 交互選擇模板。


Step 6??:主流程調度 lib/init.js

const path = require('path');
const fs = require('fs');
const downloadTemplate = require('./download');
const repo = require('./repo');
const { error, success } = require('./log');async function init(projectName) {const targetDir = path.resolve(process.cwd(), projectName);if (fs.existsSync(targetDir)) {error(`目錄 ${projectName} 已存在`);process.exit(1);}const templateRepo = repo.default;try {await downloadTemplate(templateRepo, targetDir);success(`🎉 項目 ${projectName} 初始化完成`);console.log(`👉 你可以執行:\n   cd ${projectName}\n   npm install\n   npm start`);} catch (err) {error('初始化失敗');}
}module.exports = init;

🚀 如何運行和測試

npm link      # 將 CLI 注冊為全局命令
my-cli init my-app

你的模板就會從遠程倉庫拉取并生成到 my-app 目錄!


🌱 后續拓展方向

目標技術點
多模板選擇使用 inquirer 提供列表選擇
模板渲染變量加入 ejs 渲染 package.json 等文件
模板配置項提供 .myclirc 管理默認倉庫
支持 GitLab / Gitee使用 clone: true 下載私有倉庫

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

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

相關文章

08.如何正確關閉文件

如何正確關閉文件(File Handling Best Practices) 文件操作是日常開發中非常常見的任務,正確關閉文件對于避免資源泄漏尤為關鍵。錯誤的文件關閉方式可能導致文件未保存、鎖定或其他異常。 1. 常見的錯誤方式:手動 close() 許多初學者會手動調用 close() 關閉文件,這在異…

算法入門--動態規劃(C++)

深入淺出掌握動態規劃核心思想&#xff0c;圖文并茂實戰代碼 什么是動態規劃&#xff1f; 動態規劃&#xff08;Dynamic Programming, DP&#xff09; 是一種高效解決多階段決策問題的方法。它通過將復雜問題分解為重疊子問題&#xff0c;并存儲子問題的解&#xff08;避免重…

[2025CVPR]GNN-ViTCap:用于病理圖像分類與描述模型

論文結構解析? 本文采用經典學術論文結構: ?引言?:闡述病理圖像分析的挑戰與現有方法局限性?相關工作?:系統梳理MIL、視覺語言預訓練和生物醫學語言模型三大領域?方法?:詳細闡述GNN-ViTCap四階段架構?實驗?:在BreakHis和PatchGastric數據集驗證性能?討論?:通…

Java SE--圖書管理系統模擬實現

一.設計思路首先這個系統可以由倆種用戶使用&#xff0c;分別為管理者用戶和普通者用戶&#xff0c;根據不同的用戶有不同的界面&#xff0c;每個界面有不同的功能。二.代碼實現創建三個包和一個類book包&#xff1a;包括Book類和Booklist類Book類&#xff1a;package book; pu…

[RPA] 批量數據抓取指定商品名稱信息

影刀RPA案例&#xff1a;批量數據抓取指定商品名稱信息流程圖&#xff1a;操作步驟&#xff1a;涉及的影刀RPA大致指令&#xff1a; 1. 打開影刀商城頁面 2. 使用【填寫輸入框(web)】指令輸入用戶名和密碼&#xff0c;并點擊"登錄"按鈕 3. 切換到"訂單管理"…

我的世界Java版1.21.4的Fabric模組開發教程(十四)方塊實體

這是適用于Minecraft Java版1.21.4的Fabric模組開發系列教程專欄第十四章——方塊實體。想要閱讀其他內容&#xff0c;請查看或訂閱上面的專欄。 方塊實體(Block Entity) 指的是一種用于存儲方塊額外數據的方法。但這種數據和為了控制方塊狀態而在自定義方塊類中創建的屬性不太…

【UE教程/進階】UE中的指針與引用

目錄直接屬性引用共享指針 TSharedPtr實現原理共享引用 TSharedRef弱引用指針 TWeakPtrObject弱指針 FWeakPtr實現原理Object軟指針 FSoftObjectPtr原理直接屬性引用 在c通過UPROPERTY()宏將屬性公開&#xff0c;藍圖中屬性類型中的Object Reference。 對一個類型及其子類型的…

早期 CNN 的經典模型—卷積神經網絡(LeNet)

目錄 LeNet 的設計背景與目標 LeNet 的網絡結構&#xff08;經典 LeNet-5&#xff09; 局部感受野詳解 一、局部感受野和全連接網絡的區別 1. 傳統全連接網絡的問題 2. 局部感受野的解決方案 二、局部感受野的優勢 1. 參數大幅減少 2. 提取局部特征 3. 平移不變性 參數…

RabbitMQ 高級特性之延遲隊列

1. 簡介 在某些場景下&#xff0c;當生產者發送消息后&#xff0c;可能不需要讓消費者立即接收到&#xff0c;而是讓消息延遲一段時間后再發送給消費者。 2. 實現方式 2.1 TTL 死信隊列 給消息設置過期時間后&#xff0c;若消息在這段時間內沒有被消費&#xff0c;就會將消…

uniapp app安卓下載文件 圖片 doc xls 數據流文件 app安卓本地路徑下載保存

//下載圖片 downloadToLocal() {plus.android.requestPermissions([android.permission.WRITE_EXTERNAL_STORAGE],(success) > {uni.saveImageToPhotosAlbum({filePath: /static/x.png,//本地地址success: () > {this.$refs.uToast.show({message: "模版下載成功&am…

Context Engineering:從Prompt Engineering到上下文工程的演進

最近在做Deepresearch以及刷到一個不錯的文章&#xff1a;context-engineering-guide &#xff0c;這篇文章揭示了提示工程以及上下文過程在智能體應用開源流程中&#xff0c;包括Deepresearch&#xff0c;MCP在內的一些概念&#xff0c;起到了非常重要的作用&#xff01; Cont…

jenkins部署vue前端項目

文章目錄前言一、安裝nginx二、jenkins構建項目總結前言 前面已經使用jenkins部署了后端springboot項目&#xff0c;現在開始學習jenkins部署前端Vue項目。 一、安裝nginx 訪問nginx官網&#xff0c;https://nginx.org/en/download.html下載tar包 上傳到服務器目錄中 然后到…

設計總監年中復盤:用Adobe XD內容識別布局,告別“手動調距”

時至年中&#xff0c;這不僅是檢視上半年項目成果的節點&#xff0c;更是優化團隊工作流、為下半年挑戰儲備動能的關鍵時期。在海外設計界工作的十余年間&#xff0c;我發現&#xff0c;一個高效的設計團隊與一個疲于奔命的團隊之間&#xff0c;最大的差別往往就在于是否建立了…

Unity 在Rider中通過Lingma插件使用MCP

環境&#xff1a; Unity 2022.3.12f1 JetBrains Rider 2025.1.4 Lingma 2.5.14 Python 3.13.4 下載包 首先在unity package manager 加入unity-mcp包 https://github.com/justinpbarnett/unity-mcp.git 然后下載uv包&#xff08;要先先下載python&#xff09;,網上很多…

pycharm+SSH 深度學習項目 遠程后臺運行命令

pycharmSSH 深度學習項目 遠程后臺運行命令碎碎念&#xff0c;都是實驗室里那說關機就關機&#xff0c;說重啟就重啟的臺式機逼得。。學吧記錄 運行&#xff1a;nohup /root/miniconda3/bin/python -u "run.py" > /root/log/nohup.log 2>&1 &實時查看日…

【Linux | 網絡】應用層(HTTP)

目錄一、認識URL二、urlencode和urldecode三、HTTP協議格式&#xff08;使用Fiddler抓包&#xff09;3.1 安裝并使用Fiddler抓包3.2 HTTP協議格式3.2.1 HTTP請求3.2.1.1 資源URL路徑3.2.1.2 請求方法&#xff08;Method&#xff09;3.2.1.3 Location頭字段&#xff08;重定向相…

編程實踐:單例模式(懶漢模式+餓漢模式)

說明:本專欄文章有兩種解鎖方案 1:付費訂閱,暢享所有文章 2:免費獲取,點擊下方鏈接,關注,自動獲取免費鏈接 https://free-img.400040.xyz/4/2025/04/29/6810a50b7ac8b.jpg 主題:C++ 單例模式 什么是單例模式

破局電機制造四大痛點:MES與AI視覺的協同智造實踐

萬界星空科技電機行業MES系統解決方案是針對電機制造過程中多工序協同難、質量追溯復雜、設備管理要求高等痛點設計的數字化管理系統。一、電機行業的核心痛點1. 多工序協同困難 電機制造涉及繞線、裝配、測試等多道工序&#xff0c;工藝銜接復雜&#xff0c;傳統人工調度效率…

HTML 初體驗

HTML&#xff08;超文本標記語言&#xff09;全稱&#xff1a;HyperText Markup Language。超文本是什么&#xff1f;答&#xff1a;超文本就是網頁中的鏈接。標記是什么&#xff1f;答&#xff1a;標記也叫標簽&#xff0c;是帶尖括號的文本。需求1&#xff1a;將“我愛中國”…

網絡層TCP機制

1.確認應答機制由于發送信息的距離可能較遠,可能出現后發的信息先到的情況,怎么辦?TCP將每個字節的數據都進行了編號,即為序列號如何分辨一個數據包是普通數據還是應答數據呢2.超時重傳由于丟包是一個隨機的事件,因此在上述tcp傳輸的過程中,丟包就存在兩種情況但是在發送方的角…