- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
背景
假如您在本地创建了很多仓库,又恰好碰到了重装系统的问题。导致本地项目全部丢失,当你想去开发时,却又不得不面临重新克隆仓库,便会面临重复的步骤,和我们封装的思想有点违背。于是,有了这个script诞生。
再假如您有阅读过我的上一篇文章,那么你便了解zx这个工具库,此项目便是基于zx进行开发。
没有可以移步# zx, 如何用Javascript优雅的书写脚本命令方便了解前置知识。
准备
安装 zx
搭建项目,安装zx,并创建zx可执行文件
#!/usr/bin/env zx
了解 github api
本文以 Repositories api进行参考使用
| 说明 | URL | 备注 |
|---|---|---|
| 请求url | api.github.com/users/{user… | |
| 参数1 | affiliation | 隶属关系 |
| 参数2 | direcion | 排序方式,asc升序,desc降序 |
| 参数3 | page | 分页 |
| 参数4 | sort | |
| 参数5 | visibility | 隶属关系 |
本篇文章只用到了其中一个api,更多api简介详细参考# 打造App-GitHub 开放API大总结
script
获取仓库列表
我们先直接调用github api接口,打印会输出什么内容
const user = 'chris-zhu' // github 用户名
const data = await fetch(`https://api.github.com/users/${user}/repos`)
const urls = await data.json()
我们可以看见几个详细信息,首先该接口返回的是一个仓库信息[],每条仓库信息都描述了该仓库的详细信息,仓库的id、name、url、description、fork···
所以我们可以筛选有用信息,比如我们只想拿到该${user}的原创(非fork)项目
于是我们进行筛选
const repos = urls.filter((info) => !info.fork).map((info) => info.git_url)
创建文件夹
我们需要创建一个文件夹用来存放clone的项目,并用 cd() 命令进入该文件夹
await $`rm -rf ${dir}`
await $`mkdir ${dir}`
cd(`./${dir}`)
clone
我们可以结合promise使用,去循环拉取我们的仓库地址
Promise.all(repos.map((url) => $`git clone ${url}`))
我们已经完成所有的克隆脚本编写,当然我们可以更加灵活的传参,更好的调用
所以我们可以在package.json中的项目配置。
参数配置
① 修改配置文件
到package.json中切换需要克隆地址的用户名
"scripts": {
"clone": "npx zx src/clone/index.mjs"
},
"config": {
"port": "1111",
"dir": "repos",
"user": "CHANGE YOUR GITHUB_USERNAME"
},
Then,使用脚本命令
npm run clone
// or
yarn run clone
② 使用脚本命令传参
通过命令传参的方式注入
npm run clone -- xxx // xxx is your github_username
or
yarn run clone -- xxx // xxx is your github_username
script中接受参数
let [, , , user] = process.argv
user = user || process.env.npm_package_config_user // 克隆用户名
const dir = process.env.npm_package_config_dir // 克隆目录存放的文件夹
完美。