開篇
在上一篇文章中,給 nue-cli 新增了與使用者終端互動的功能,這一次來實現一個拉取版本號的功能。
這個功能的背景是,有時候我們在使用腳手架的時候,不同版本的腳手架可能會有不同的功能,所以使用者有可能會根據自己的需求選擇不同的版本,所以這裡將會實現一個根據使用者選擇的版本號,拉取對應的版本號的模板。
實現
說到這個拉取版本號的功能,其實就是一個簡單的功能,最核心的就是如何獲取到 GitHub 上的版本號。
獲取 GitHub 上的版本號
繼續回到上次 GitHub Api 文件中,找一下與倉庫相關獲取倉庫版本號的介面。
回到 https://docs.github.com/en/rest?apiVersion=2022-11-28 ,在左側導航欄中找到 Repositories
,然後點選 Repositories
,找到 List repository tags
:
點選 List repository tags
,找到 GET /repos/{owner}/{repo}/tags
這個 Api,這個 Api 主要作用就是列出指定儲存庫的標籤。
簡單解釋一下這個請求地址:
- owner:倉庫所屬的使用者或組織
- repo:倉庫名稱
{}
是佔位符,需要替換成具體的值,例如我要獲取 vue-simple-template
這個倉庫的版本號,請求地址就是:https://api.github.com/repos/neo-it6666/vue-simple-template/tags
。
在瀏覽器中輸入這個地址,看看返回的資料:
發現返回的資料是一個陣列,但是是一個空陣列,這是因為我這個倉庫還沒有釋出版本號,所以這裡就是一個空陣列。
釋出版本號
在 GitHub 上釋出版本號,其實就是在倉庫中釋出一個 Release,這個 Release 就是一個版本號。
首先進入到倉庫中,然後點選 Releases
:
然後點選 Create a new release
進入到釋出版本號的頁面:
首先 Create new tag
,然後填寫版本號,這裡我填寫的是 v1.0.0
:
然後填寫一下 Write
,然後點選 Publish release
,這樣就釋出了一個版本號,然後再次請求 https://api.github.com/repos/neo-it6666/vue-simple-template/tags
:
這回就返回了一個陣列,陣列中就是釋出的版本號。
獲取版本號
接下來就是在程式碼中獲取這個版本號了,一樣的利用之前安裝好的 axios,進行請求,先上程式碼:
const getTemplateTags = async (currentTemplateName) => {
const {data} = await axios.get(`https://api.github.com/repos/neo-it6666/${currentTemplateName}/tags`)
return data;
}
首先我單獨編寫了一個方法 getTemplateTags
,這個方法接收一個引數 currentTemplateName
,這個引數就是當前使用者選擇的模板名稱,然後透過 axios 請求 GitHub Api,獲取到對應倉庫的版本號。
程式碼比較簡單,不多講,接下來就是使用這個方法,獲取到版本號,先上程式碼:
const fetchTemplateTags = await getTemplateTags(template);
const tags = fetchTemplateTags.map((item) => item.name);
console.log(tags);
這裡我呼叫了 getTemplateTags
方法,傳入了使用者選擇的模板名稱,然後獲取到版本號,然後透過 map
方法取出版本號,最後列印到終端中。
這樣就獲取到了 GitHub 上的版本號,最後在新增上使用者與終端互動的功能,就可以實現一個拉取版本號的功能了,在此之前我發現我下拉的版本號時控制檯沒有載入效果利用 ora 新增一下,改造 getTemplateTags 方法:
const getTemplateTags = async (currentTemplateName) => {
const spinner = ora('Loading tags...').start();
const {data} = await axios.get(`https://api.github.com/repos/neo-it6666/${currentTemplateName}/tags`)
spinner.succeed('Tags loaded successfully');
return data;
}
這樣效果就更好了,然後再新增一個與使用者互動讓使用者選擇版本號,一樣的玩法利用 inquirer 新增一個選擇版本號的功能:
const { version } = await inquirer.prompt({
name: 'version',
type: 'list',
message: 'Please select the version number',
choices: tags
})
console.log(version);
這裡要說下,這裡的 inquirer.prompt 方法傳遞的是一個物件之前是直接傳遞的陣列,這裡傳遞的是一個物件,這兩種方式在功能上是等價的,都可以實現相同的效果, 區別在於語法和風格:
- 陣列形式:當你使用陣列時,可以更清晰地表示每個提示是一個獨立的實體。這種方式在有多個提示或者每個提示需要更復雜的配置時特別有用。
- 物件形式:當你只需要一個簡單的提示時,使用物件形式可以使程式碼更簡潔。它減少了一些冗餘的括號,使得程式碼看起來更緊湊。
好了別的內容就不多說了,這裡就是手撕 Vue-CLI 拉取版本號的功能,下一篇文章再來實現拉取模板的功能。