remote-git-tags 源码收获
主文件
import { promisify } from 'node:util';
import childProcess from 'node:child_process';
const execFile = promisify(childProcess.execFile)
export default async function remoteGitTags(repoUrl){
const { stdout } = await execFile('git',['ls-remote','--tags',repoUrl])
const tags = new Map()
for(const line of stdout.trim().split('\n')){
const [hash,tagReference] = line.split('\t')
const tagName = tagReference.replace(/^refs\/tags\//,'').replace(/\^{}$/,'')
tags.set(tagName,hash)
}
return tags
}
主文件挺简单的一看就懂了,通过字符串分割以后,通过正则将tagName和hash分割出来,以tagName作为key,hash作为value存储在Map对象中。
promisify
- 作用:将callback形式转换为Promise对象
- Node中异步回调中有个约定:Error first,回调函数中的第一个参数一定是Error对象,其余参数才是正确的数据。
function promisify(original){
return function fn(...args){
return new Promise((resolve, reject) => {
args.push((err,...values) => {
if(err){
return reject(err)
}
resolve(values)
})
Reflect.apply(original,this,args)
})
}
}
收获
这次这个主文件比较简单,就是用调试工具来走了下流程,最大的收获是学会了手写简易版的promisify,继续努力