序
我们都知道github 是开源的,不需要登录,就可以浏览任意一个public开源项目。所以项目模板托管在这个上面,不涉及到token登录认证操作的。
但是,我们实际场景是,公司内部项目。一般都托管到一个内部部署的gitlab服上。此时你的脚手架想取到内部的gitlab上托管的模板项目时候,就需要走gitlab 官方提供的token认证方式。
获取token
切刀群组下,点击个人资料,点击setting.
选择 access tokens。
输入token的name。选择一个过期时间,不选默认是365天。scopes下选择第一个选项 api ,代表这个token可以操作的gitlab范围是:读写仓库。你可以简单的理解是下边那些选项的合集。 官方对token的解读
使用token
这里我们采用最后一种形式:
You can also use personal, project, or group access tokens with OAuth-compliant headers:
curl --header "Authorization: Bearer <your_access_token>" "gitlab.example.com/api/v4/proj…"
gitlab api介绍
功能 | 接口 | 功能描述 |
---|---|---|
获取项目代码 | GET /projects/:id/repository/archive.zip?ref=branch | 可以获取指定分支代码的zip包 |
获取项目信息 | GET /projects/:id | 可以获取指定项目的详细信息,包括项目的名称、描述、创建者、创建时间、最近更新时间、访问级别、仓库 URL、分支信息、标签信息等。 |
获取项目列表 | GET /projects | 可以获取当前用户或指定用户下的项目列表,可以设置不同的参数来筛选和排序项目,例如项目的可见性、访问级别、所属组织、创建者、名称等。 |
获取项目文件内容 | GET /projects/:id/repository/files/:file_path | 可以获取指定项目中某个文件的内容,可以设置文件路径、分支名称、文件格式等参数。 |
获取项目目录内容 | GET /projects/:id/repository/tree | 可以获取指定项目中某个目录下的文件和子目录的信息,可以设置目录路径、分支名称、递归深度等参数。 |
获取项目提交列表 | GET /projects/:id/repository/commits | 可以获取指定项目的提交列表,包括提交 ID、提交者信息、提交时间、提交信息、变更文件等。 |
获取项目分支列表 | GET /projects/:id/repository/branches | 可以获取指定项目的分支列表,包括分支名称、最近提交信息、保护状态等。 |
获取项目标签列表 | GET /projects/:id/repository/tags | 可以获取指定项目的标签列表,包括标签名称、标签信息、提交信息等。 |
获取项目合并请求列表 | GET /projects/:id/merge_requests | 可以获取指定项目的合并请求列表,包括合并请求的标题、描述、状态、提交信息等。 |
获取代码的API
根据官方api 说明:我们构造出了可以拿到项目代码的地址了。
http://192.168.9.918/api/v4/projects/251/repository/archive.zip?ref=master
那我们平时下载gitlab的代码压缩包,有啥区别呢?
http://192.168.9.918/web/yourPrjectTplName/repository/archive.zip?ref=master
前者 我们是通过git-api 的方式,发请求拿资源时候需要头中携带先前生成好的token。后者就是我们浏览器里已经登录过了,我们在地址栏里直接输入资源地址,浏览器帮我们完成了下载动作。
代码实现
const fs = require("fs")
const path = require("path")
const currentPath = process.cwd();
const spinner = require("./spinner")
const os = require("os")
const { deletePath , unzipFile } = require("./io")
const axios = require("axios")
let baseUrl = "http://192.168.9.918/api/v4"//gitlab api
let token = "s1jrCUXD6QLgKvbnD2xy"//token name :Bearer
let projectID = '251';//锁定具体项目
let url = `${baseUrl}/projects/${projectID}/repository/archive.zip?ref=master`
module.exports = function(templateName,projectName,callback){
// 压缩包下载的目录,这里是在系统临时文件目录创建一个目录
const tempProjectPath = fs.mkdtempSync(path.join(os.tmpdir(), `${projectName}-`));
// 压缩包保存的路径
const file = path.join(tempProjectPath,`${templateName}.zip`);
axios({
method:"GET",
url:url,
responseType:"arraybuffer",
responseEncoding:"binary",
headers:{
'Authorization':`Bearer ${token}`
},
}).then((res)=>{
fs.writeFileSync(file,res.data,"binary")
// 获取解压的目录
const destPath = path.join(currentPath,`${projectName}`);
// 解压已下载的模板压缩包
unzipFile(file,destPath,(error)=>{
// 删除创建的临时文件夹
deletePath(tempProjectPath);
callback && callback()
});
}).catch((error)=>{
console.log(error,"下载出错")
})
}
注意:
- 请求方式:一定是get。gitlab 官网已经写了:所以注意保持一致。
- 我们下载zip文件,注意请求类型,请求编码。
responseType: "arraybuffer",
responseEncoding: "binary"
- 下载后二进制文件流 同步写入文件系统时,注意格式也是
binary
。