PKG打包sqlite3项目,如何添加node_sqlite3.node依赖

项目地址:https://github.com/helson-lin/pkg_sqlite

ffandown项目内,由于项目使用了sqlite3,在跨平台打包的时候,除了本机外其他平台打包之后运行缺少node_sqlite3.node依赖。

为了解决问题,百度了很久,能够实现的方案就三种。

  1. 分别在不同平台打包,这个是最直接的方法。
  2. node_sqlite3.node文件放在可执行文件同级目录下,运行的时候binding会自动找到。
  3. 在每一次构建之后,手动将node_sqlite3.node依赖移动到node_modules/sqlite3/building/Release/, 该方案支持github actions自动打包。

方案3如何实现github actions自动打包

准备好各个平台的node_sqlite3.node文件

在这里插入图片描述

文件可以从TryGhost-GIthub下载

编写脚本打包之前替换node_sqlite3.node文件

脚本如下,主要思路就是,在每个平台打包之前,现将对应平台的文件移动到node_modules/sqlite3/building/Release/下面。
如果直接使用改脚本,请确保package下面文件的名称和我的保持一致。

📢 需要注意,这个脚本运行之前有一些前提的条件

  1. package.json配置好pkg配置项, 包括targets和assets
  2. 所有的node文件放在同级的package目录下
  3. 脚本文件放在根目录下面的
#!/usr/bin/env node
const fs = require("fs");
const path = require("path");
const { execSync} = require('child_process')
// 源文件路径(根据你的项目结构调整)
let isDebug = false;
let releaseName;
const argv = process.argv.slice(2)
//  支持debug参数
if (argv && argv[0] === '--debug') isDebug = true
// package为我的项目根目录下面文件夹存放node文件
const sourcePath = path.join(__dirname, "package/");
// 目标路径
const targetPath = path.join(__dirname, "node_modules/sqlite3/build/Release/");const moveNodeSqlite = (targetPlatform) => {// 根据目标平台选择正确的文件,这里只写了几个平台可以自行补充let targetFile;const name = targetPlatform.split('-').slice(1).join('-')switch (name) {case "linux-x64":targetFile = "linux_x64_node_sqlite3.node";break;case "linux-arm64":targetFile = "linux_arm64_node_sqlite3.node";break;case "macos-arm64":targetFile = "macos_arm64_node_sqlite3.node";break;case "macos-arm64":targetFile = "macos_x64_node_sqlite3.node";break;default:console.error(`\n ❗️ Unsupported target platform:${targetPlatform} \n`);}if (targetFile) {// 复制文件fs.copyFileSync(path.join(sourcePath, targetFile),path.join(targetPath, "node_sqlite3.node"));console.log(`\n ✅ Copied ${path.join(sourcePath, targetFile)} to ${path.join(targetPath,"node_sqlite3.node")}\n`);}
};const pkgRelease = (targetPlatform) => {moveNodeSqlite(targetPlatform);// 执行打包命令//  --output指定输出的目录地址,和文件的名称execSync(`pkg . -t ${targetPlatform} --output ./dist/${releaseName}-${targetPlatform}${targetPlatform.indexOf('windows') !== -1 ? '.exe' : ''}` + (isDebug ? ' --debug' : ''), { stdio: 'inherit' })
};const start = () => {try {const dataString = fs.readFileSync(path.join(__dirname, 'package.json'), 'utf-8')const data = JSON.parse(dataString)const platforms = data.pkg.targetsreleaseName = data.namefor (let item of platforms) {pkgRelease(item)}} catch (e) {console.error('❗️ read package.json failed', e)}
}start()

package.json配置

这里只粘贴了pkg配置部分、
scripts配置项为需要打包的js文件
assets配置项必不可少,少了node文件不会被打包到可执行文件内
targets配置项填写需要构建的平台,这里被脚本引用了,少了脚本会出现问题。

{"name": "docker_sync","version": "1.0.0","description": "","main": "index.js","bin": "index.js","scripts": {"build": "node build.js"},"repository": {"type": "git","url": "git+https://github.com/helson-lin/docker_sync_template.git"},"keywords": ["demo"],"author": "helsonlin","license": "ISC","pkg": {"scripts": ["index.js","db.js"],"assets": ["/node_modules/sqlite3/build/**/*"],"targets": ["node14-macos-arm64","node14-macos-x64","node14-windows-x64","node14-linux-x64","node14-linux-arm64","node14-alpine-x64","node14-alpine-arm64"],"outputPath": "dist"},"bugs": {"url": "https://github.com/helson-lin/docker_sync_template/issues"},"homepage": "https://github.com/helson-lin/docker_sync_template#readme","devDependencies": {"body-parser": "^1.20.2","express": "^4.18.2","pkg": "^5.8.1","sqlite3": "^5.1.6"}
}

Github actions配置

该配置文件不做过多解释

name: Build and push Docker imageon:push:branches: [ main ]tags:- 'v*.*.*'jobs:build:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkout@v2- name: Npm Installrun: npm install --registry=https://registry.npmmirror.com- name: Build Releaserun: npm run build- name: releaseuses: softprops/action-gh-release@v1if: startsWith(github.ref, 'refs/tags/')with:files: "dist/**"env:GITHUB_TOKEN: ${{ secrets.TOKEN }}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/35304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构建RESTful API:PHP框架中的实践与策略

随着Web服务的兴起,RESTful API成为前后端分离架构中的关键组件。PHP作为一种广泛使用的服务器端脚本语言,通过各种现代框架提供了构建RESTful API的强大工具和灵活性。本文将详细介绍如何在PHP框架中实现RESTful API,探讨设计原则、实现步骤…

NLP 相关知识

NLP 相关知识 NLPLLMPrompt ChainingLangChain NLP NLP(Natuarl Language Processing)是人工智能的一个分支,中文名自然语言处理,专注于处理和理解人类使用的自然语言。它涵盖了多个子领域,如文本分类、情感分析、机器…

思维导图麒麟liunx系统

系统管理与计划任 ” 使用at命令提交任务。 6.2.1 at任务概述 6.1.4 定时任务的使用场景 at任务是指使用at命令安排的,只执行一次的任务它允许用户指定在未来某个特定时间执行命令或脚本定时更新系统软件包。定时清理系统临时文件。自动备份文件和数据库。 at:用于一…

pytorch 源码阅读(2)——torch._dynamo.optimize

0 torch._dynamo.optimize(backend, *, nopython, guard_export_fn, guard_fail_fn, disable, dynamic),TorchDynamo 的主入口点 1 参数说明 backend,一般有两种情况: 一个包含 torch.fx.GraphModule 和 example_inputs,返回一个…

【websocket】websocket网课视频记录

仅个人方便回顾。 【WebSocket入门与案例实战-哔哩哔哩】 https://b23.tv/2p1f9t2 课程对应代码仓库: https://gitee.com/duoli-java/websocket-demo.git

C++编程(二)引用

文章目录 一、C中的引用(一)引用1. 语法格式2. 作用3. 注意事项 (二)常引用2. 其他场景 (三)引用和函数结合使用1. 引用可以作为函数的参数2. 引用可以作为函数的返回值 (四)引用和指…

在 C/C++ 中使用 popen去执行linux命令样例,失败场景

在 C/C 中使用 popen 函数去执行 Linux 命令是一种常见的方式,但确实存在多种可能导致失败的场景。以下是一些可能导致 popen 失败的常见原因和样例: 命令不存在或路径错误: 如果你尝试执行的命令不存在于系统的 PATH 环境变量中,…

记因hive配置文件参数运用不当导致 sqoop MySQL导入数据到hive 失败的案例

sqoop MySQL导入数据到hive报错 ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: Hive exited with status 64 报错解释: 这个错误表明Sqoop在尝试导入数据到Hive时遇到了问题,导致Hive进程异常退出。状态码…

HarmonyOS Next开发学习手册——通过startAbility拉起文件处理类应用

使用场景 开发者可以通过调用startAbility接口,由系统从已安装的应用中寻找符合要求的应用来实现打开特定文件的意图,例如:浏览器下应用下载PDF文件,可以调用此接口选择文件处理应用打开此PDF文件。开发者需要在请求中设置待打开…

三个方法计算两张图片的相似度

import cv2 import numpy as np from skimage.metrics import structural_similarity as ssim import osdef is_similar(image1, image2, threshold0.95):对图像的颜色信息敏感,能快速计算。对图像的旋转、缩放等几何变换不敏感。缺点:对图像的结构、纹理等信息不敏…

0625_ARM2

练习: 汇编实现1-100累加,结果保存在r0 .text .global _start start:mov r0,#0mov r1,#1b loop loop:add r0,r0,r1add r1,r1,#1cmp r1,#101bne loop .end思维导图:

C#——SortedList 排序列表详情

SortedList 排序列表 SortedList 类用来表示键/值对的集合,这些键/值对按照键值进行排序,并且可以通过键或索引访问集合中的各个项。 我们可以将排序列表看作是数组和哈希表的组合,其中包含了可以使用键或索引访问各项的列表。如果您使用索…

tensorflow学习1.3-创建会话,启动会话

tensorflow学习1.3-创建会话,启动会话 会话的由来与作用由来作用 会话的定义与结构定义 用法基本用法上下文管理器执行部分计算图获取多个结果 总结 练习代码报错原因:TensorFlow 2.x中的Eager Execution使用兼容模式来启用SessionEager Execution和计算…

AI文档助手:提升文档处理效率

随着人工智能技术的飞速发展,AI文档助手已经成为我们提升工作效率的重要工具。小编就来和大家分享几款AI文档助手,它们能够通过智能化的功能帮助我们快速、准确地完成各种文档任务。 1.百度文库AI助手 百度文库AI助手是百度基于文心一言重构的一站式智能…

全景图片/老照片/动漫图片一键无损放大与修复

在日常生活中,我们经常使用系统自带的图片处理软件来对图片进行缩放操作,从而实现放大或缩小图片。然而,这种方法会带来一个问题:如果原始图片较小,放大后会导致精度损失,使图片变得模糊。 近年来&#xf…

vue uniapp MEQX JWT认证

1.下载依赖 npm install mqttimport * as mqtt from "mqtt/dist/mqtt.min" ​ 我是用的uniapp vue3 vite这里尝试了很多方式,都导入不进去后来我就采用的本地引入方式, 把mqtt.min.js下载到本地然后在index.html 中导入<script src"./MEQX/mqtt.js" typ…

rapidocr-onnxruntime库及在open-webui上传PDF 图像处理 (使用 OCR)应用

背景 rapidocr-onnxruntime是一个跨平台的OCR库&#xff0c;基于ONNXRuntime推理框架。 目前已知运行速度最快、支持最广&#xff0c;完全开源免费并支持离线快速部署的多平台多语言OCR。 缘起&#xff1a;百度paddle工程化不是太好&#xff0c;为了方便大家在各种端上进行oc…

终极指南:解决iCloud备份错误代码的全面策略

终极指南&#xff1a;解决iCloud备份错误代码的全面策略 在数字化时代&#xff0c;数据安全至关重要。iCloud作为Apple提供的云服务&#xff0c;为我们的iPhone、iPad等设备提供了便捷的数据备份与恢复功能。然而&#xff0c;在使用过程中&#xff0c;我们可能会遇到各种备份错…

ros,open3d单线激光雷达数据可视化

之前一直尝试将可视化写在ros的回调函数中&#xff0c;visualization一直会阻塞进程&#xff0c;换一种方式可以顺利实现可视化 import rospy import open3d as o3d import numpy as np from sensor_msgs.msg import LaserScanglobal scan_data scan_data Nonedef callback_l…

机器学习之对比学习方法SimSiam(Simple Siamese)

SimSiam(Simple Siamese)是一种自监督对比学习方法,由Facebook AI Research于2021年提出。SimSiam的设计旨在避免负样本对,并且不使用动量编码器,进一步简化了对比学习的实现过程。 SimSiam的基本概念 自监督学习: 自监督学习方法通过从数据本身获取监督信号进行学习,不…