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文件

这里演示没有配置所有的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.rhkb.cn/news/363735.html

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

相关文章

分享一个导出数据到 Excel 的解决方案

前言 许多业务场景下需要处理和分析大量的数据,而 Excel 是广泛使用的文件格式,几乎所有人都能打开和查看 Excel 文件,因此将数据库中的原始数据处理后,导出到 Excel 是一个很常见的功能,对于数据管理、分析、备份、展…

【代码随想录】【算法训练营】【第45天】 [198]打家劫舍 [213]打家劫舍II [337]打家劫舍III

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 45,周五,坚持不了一点~ 题目详情 [198] 打家劫舍 题目描述 198 打家劫舍 解题思路 前提:相邻两房屋不能连续盗窃 思路:动态规划, dp[i]: [0,…

【C语言】--操作符详解

🌭个人主页: 起名字真南 🍿个人专栏:【数据结构初阶】 【C语言】 目录 1 算术操作符1.1 和 -1.2 *1.3 /1.4 % 2 赋值操作符 :2.1 复合赋值符 3 单目操作符3.1 和- - 4 强制类型转换5 printf 和 scanf5.1 printf5.1.1 基本用法5.1.2 占位符5.…

Navicat连接Oracle出现Oracle library is not loaded的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 使用Navicat链接Oracle的时候,出现如下提示:Oracle library is not loaded. 截图如下所示: 2. 原理分析 通常是由于缺少必需的 Oracle 客户端库或环境变量未正确配置所致 还有一种情况是 32位与64位的不匹配:Navica…

【数据可视化技术】1、如何使用Matplotlib和Seaborn库在Python中绘制热力图

热力图是一种数据可视化技术,可以显示变量之间的相关性。这个代码段是数据分析和可视化的常用方法,特别适合于展示变量之间的相关性,对于数据科学和机器学习项目非常有帮助。 1、 导入必要的库 首先,确保你已经安装了matplotlib…

javaSE知识点整理总结(上)

目录 一、面向对象 1. 类、对象、方法 2.面向对象三大特征 (1)封装 (2)继承 (3)多态 二、常用类 1.Object类 2.Array类 3.基本数据类型包装类 4.String类 5.StringBuffer类 6.Math类 7.Random…

WAIC2024 | 华院计算邀您共赴2024年世界人工智能大会,见证未来科技革新

在智能时代的浪潮汹涌澎湃之际,算法已成为推动社会进步的核心力量。作为中国认知智能技术的领军企业,华院计算在人工智能的广阔天地中,不断探索、创新,致力于将算法的潜力发挥到极致。在过去的时日里,华院计算不断探索…

Mac可以读取NTFS吗 Mac NTFS软件哪个好 mac ntfs读写工具免费

在跨操作系统环境下使用外部存储设备时,特别是当Windows系统的U盘被连接到Mac电脑时,常常会遇到文件系统兼容性的问题。由于Mac OS原生并不完全支持对NTFS格式磁盘的读写操作,导致用户无法直接在Mac上向NTFS格式的U盘或硬盘写入数据。下面我们…

SpringBoot:使用Spring Batch实现批处理任务

引言 在企业级应用中,批处理任务是不可或缺的一部分。它们通常用于处理大量数据,如数据迁移、数据清洗、生成报告等。Spring Batch是Spring框架的一部分,专为批处理任务设计,提供了简化的配置和强大的功能。本文将介绍如何使用Spr…

排序(冒泡排序、选择排序、插入排序、希尔排序)-->深度剖析(一)

欢迎来到我的Blog,点击关注哦💕 前言 排序是一种基本的数据处理操作,它涉及将一系列项目重新排列,以便按照指定的标准(通常是数值大小)进行排序。在C语言中,排序算法是用来对元素进行排序的一系…

【高性能服务器】服务器概述

🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 服务器概述 服…

DDMA信号处理以及数据处理的流程---聚类

Hello,大家好,我是Xiaojie,好久不见,欢迎大家能够和Xiaojie一起学习毫米波雷达知识,Xiaojie准备连载一个系列的文章—DDMA信号处理以及数据处理的流程,本系列文章将从目标生成、信号仿真、测距、测速、cfar检测、测角、目标聚类、目标跟踪这几个模块逐步介绍,这个系列的…

静态链表详解(C语言版)

顺序表和链表的优缺点 顺序表和链表是两种基本的线性数据结构,它们各自有不同的优缺点,适用于不同的应用场景。 顺序表(Sequential List,通常指数组) 优点: 随机访问:可以通过索引快速访问任…

【技术追踪】UNest:一种用于非配对医学图像合成的新框架(MICCAI-2024)

前天看了一篇文章图像分割用diffusion,今天看了篇文章图像合成不用diffusion,你说说这~ 传送门:【技术追踪】SDSeg:医学图像的 Stable Diffusion 分割(MICCAI-2024) UNest:UNet结构的Transforme…

Java对象类辨识指南:Object与Objects类的区别详解

今天在写lambda表达式时,用filter来做过滤判断我的结果是否为null时使用到了Objects.nonNull,但是敲着敲着发现不对劲,怎么没有nonNull方法?? 其实时我少敲了一个s,当时自己并没有很清楚Object和Objects两者之前的区别&#xf…

Ansible-综合练习-生产案例

斌的招儿 网上教程大多都是官网模板化的教程和文档,这里小斌用自己实际生产环境使用的例子给大家做一个详解。涉及到一整套ansible的使用,对于roles的使用,也仅涉及到tasks和files目录,方便大家快速上手并规范化管理。 0.环境配置…

波音危机:星际客机飞船故障,宇航员被困太空!马斯克的SpaceX的“龙”飞船来救援?

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 在人类探索宇宙的漫漫征途中,波音公司的“星际客机”承载着无限的希望与梦想,却也面临着前所未有的挑战。从原计划的8天…

pdf已加密如何解除?解密密码的两个方法【可加密】

电脑文件加密的目的就是保护重要信息,防止数据泄露。如果需要解除密码,应该如何操作呢?pdf已加密如何解除?本文整理了以下两种解除文件方法,希望能够帮到有需要的朋友们! 方法一、使用金舟文件夹加密大师解…

实验八 T_SQL编程

题目 以电子商务系统数据库ecommerce为例 1、在ecommerce数据库,针对会员表member首先创建一个“呼和浩特地区”会员的视图view_hohhot,然后通过该视图查询来自“呼和浩特”地区的会员信息,用批处理命令语句将问题进行分割,并分…

c语言--指针

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理c语言中指针的相关知识点。 指针概念 指针存储的就是数据的地址。 直观理解: 李华家是北洋路130号1单元101 用变量处理数据: 我们去李华家拿数据。 用指针处理数据: 我们去北洋路130号1单元101拿数据…