hb-cli-ugreen
Version:
用于uniapp的打包工具,可切换环境变量、可多配置,切换证书,更改版本,wifi调试
241 lines (222 loc) • 8.07 kB
JavaScript
const axios = require("axios");
const FormData = require("form-data");
const fs = require("fs");
const SMB2 = require('smb2');
const path = require("path");
const dayjs = require("dayjs");
/**
* 上传文件
* @param {*} uploadUrl 上传路径
* @param {*} fileUrl 文件路径
* @param {*} data post的数据
*/
async function upload(uploadUrl, fileUrl, data) {
console.log("准备上传文件");
let formData = new FormData();
let fileData = fs.createReadStream(fileUrl); // 根目录下需要有一个test.jpg文件
if (data && typeof data == "object") {
for (const key in data) {
if (Object.hasOwnProperty.call(data, key)) {
const val = data[key];
formData.append(key, val);
}
}
}
formData.append("file", fileData);
return new Promise((resolve, reject) => {
axios({
url: uploadUrl,
method: "POST",
data: formData,
// headers: formData.getHeaders(),
maxContentLength: `Infinity`,
maxBodyLength: `Infinity`,
onUploadProgress(progressEvent) {
// console.log("progressEvent", progressEvent);
if (progressEvent.lengthComputable) {
//属性lengthComputable主要表明总共需要完成的工作量和已经完成的工作是否可以被测量
//如果lengthComputable为false,就获取不到progressEvent.total和progressEvent.loaded
let upLoadProgress = (progressEvent.loaded / progressEvent.total) * 100; //实时获取上传进度
console.log(
upLoadProgress + "%",
progressEvent.loaded,
progressEvent.total
);
}
},
})
.then((res) => {
console.log("上传文件返回", res.data);
resolve();
})
.catch((err) => {
console.log("上传文件失败", err.message);
reject(err);
});
});
}
/**
* @param {Object} shareDir 共享文件夹的地址
* @param {Object} fileUrl 要上传文件路径
* @param {Object} username 具有访问权限的用户名
* @param {Object} password 用户名对应的密码
* @param {Object} HBuilderConfig HBuilderConfig.json 配置文件
*/
async function uploadFileToShareDir(shareDir, fileUrl, username, password,HBuilderConfig) {
console.log("上传共享文件地址: ", shareDir);
const filePath = path.join(fileUrl);
// 读取文件
fs.readFile(filePath, /* 'utf8', */(err, data) => {
if (err) {
console.error('Failed to read file:', err);
return;
}
// 使用 path.basename 提取文件名
const apkFileName = path.basename(fileUrl);
let fallingName = "_debug";
console.log('File content read success name: ', apkFileName);
if (!HBuilderConfig?.isdebug) {
fallingName = "_release";
}
if (apkFileName.includes(".apk")) {
const lastUnderscoreIndex = apkFileName.lastIndexOf("_");
const lastDotIndex = apkFileName.lastIndexOf(".");
const timestamp = apkFileName.substring(lastUnderscoreIndex + 1, lastDotIndex);
fallingName = timestamp + fallingName + ".apk";
console.log('fallingName: ', fallingName);
} else {
// 找到最后一个下划线和最后一个点的位置
const lastUnderscoreIndex = apkFileName.lastIndexOf("_");
const lastDotIndex = apkFileName.lastIndexOf(".");
// 提取时间戳和扩展名
const timestamp = apkFileName.substring(lastUnderscoreIndex + 1, lastDotIndex); // 提取时间戳
fallingName = timestamp + fallingName + ".ipa";
console.log('fallingName: ', fallingName);
}
if (HBuilderConfig?.packagename) {
fallingName = HBuilderConfig?.packagename + fallingName;
}
const writefilePath = path.join(shareDir, fallingName); // 要写入的文件路径
// 写入文件
fs.writeFile(writefilePath, data, (err) => {
if (err) {
console.error('Failed to write file:', err);
return;
}
console.log('File written successfully:', writefilePath);
});
});
}
/**
*
* @param {string} url app资源地址
* @param {string} filepath 文件下载的本地目录
* @param {string} name 文件名称
* @returns 本地文件路径名称
*/
async function downloadFile(url, filepath, name) {
console.log("准备下载文件", url);
if (!fs.existsSync(filepath)) {
fs.mkdirSync(filepath, { recursive: true });
}
const mypath = path.join(filepath, name);
const writer = fs.createWriteStream(mypath);
// return Promise.resolve(
// "F:\\ShouGang\\app\\GasMonitoring\\unpackage\\release\\ipa\\GasMonitoring-09242334.ipa"
// );
const response = await axios({
url,
method: "GET",
responseType: "stream",
});
response.data.pipe(writer);
return new Promise((resolve, reject) => {
writer.on("finish", () => {
console.log("下载完成");
writer.end();
resolve(mypath);
});
writer.on("error", () => {
writer.end();
console.log("下载失败");
reject("下载失败");
});
});
}
/**
*
* @param {string} url app通知地址
* @param {string} data 通知内容
* @param {string} shareDir 共享文件夹目录
* @param {string} fileUrl 具体文件路径
* @param {Object} HBuilderConfig HBuilderConfig.json 配置文件
* "text": "#### ugreen 测试版本 \n > #### 版本号: v2.0.5 586 \n > #### 版本内容: markdown 格式验证打包\n > #### 提测时间: 2025.4.7 16:20\n"
*/
async function sendNotification(url, data, shareDir, fileUrl,HBuilderConfig) {
const time = dayjs().format("YYYYMMDDHHmm");
// 使用 path.basename 提取文件名
const apkFileName = path.basename(fileUrl);
let fallingName = "_debug";
console.log('File content read success name: ', apkFileName);
if (!HBuilderConfig?.isdebug) {
fallingName = "_release";
}
if (apkFileName.includes(".apk")) {
const lastUnderscoreIndex = apkFileName.lastIndexOf("_");
const lastDotIndex = apkFileName.lastIndexOf(".");
const timestamp = apkFileName.substring(lastUnderscoreIndex + 1, lastDotIndex);
fallingName = timestamp + fallingName + ".apk";
console.log('fallingName: ', fallingName);
} else {
// 找到最后一个下划线和最后一个点的位置
const lastUnderscoreIndex = apkFileName.lastIndexOf("_");
const lastDotIndex = apkFileName.lastIndexOf(".");
// 提取时间戳和扩展名
const timestamp = apkFileName.substring(lastUnderscoreIndex + 1, lastDotIndex); // 提取时间戳
const extension = apkFileName.substring(lastDotIndex); // 提取扩展名
fallingName = timestamp + fallingName + ".ipa";
console.log('fallingName: ', fallingName);
}
if (HBuilderConfig?.packagename) {
fallingName = HBuilderConfig?.packagename + fallingName;
}
const jsonText = data.markdown.text;
const lastText = jsonText + '> #### apk 地址: \\' + shareDir + '\\\\' + fallingName + '\n' + '> #### 打包时间: ' + time + '\n';
data.markdown.text = lastText;
console.log("通知地址: ", url);
console.log("通知内容: ", lastText);
console.log("body 内容: ", JSON.stringify(data));
try {
const response = await fetch(url, {
method: "POST", // 使用 POST 方法
headers: {
"Content-Type": "application/json", // 设置请求头,表示发送的是 JSON 数据
},
body: JSON.stringify(data), // 将数据转换为 JSON 格式
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const result = await response.json(); // 解析返回的 JSON 数据
console.log("通知已发送:", result);
} catch (error) {
console.error("发送通知失败:", error);
}
}
// 调用函数发送通知
// sendNotification(notificationData);
// downloadFile(
// "https://ide.dcloud.net.cn/build/download/2f6a4090-3c08-11ed-a02d-992ce364be7a",
// "./ios/app/ipa",
// Date.now() + ".ipa"
// );
// upload(
// "http://127.0.0.1:1080/api/file/upload",
// "F:\\ShouGang\\nfcManage\\NFC\\unpackage\\release\\apk\\__UNI__D8AA064__20220924174752.apk"
// );
module.exports = {
upload,
downloadFile,
sendNotification,
uploadFileToShareDir,
};