UNPKG

hb-cli-ugreen

Version:

用于uniapp的打包工具,可切换环境变量、可多配置,切换证书,更改版本,wifi调试

241 lines (222 loc) 8.07 kB
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, };