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.targets
    releaseName = data.name
    for (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 image

on:
  push:
    branches: [ main ]
    tags:
        - 'v*.*.*'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:

    - name: Checkout code
      uses: actions/checkout@v2

    - name: Npm Install
      run: npm install --registry=https://registry.npmmirror.com

    - name: Build Release
      run: npm run build

    - name: release
      uses: softprops/action-gh-release@v1
      if: startsWith(github.ref, 'refs/tags/')
      with:
        files: "dist/**"
      env:
        GITHUB_TOKEN: ${{ secrets.TOKEN }}

效果

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么您需要将软件本地化为其他语言

将软件翻译成其他语言可以让用户和开发软件的公司受益。以下是软件翻译之所以重要的几个原因: 不断增加的受众:当软件被翻译成不同的语言时,世界各地的更多人都可以访问它。这使公司能够扩大客户群并增加销售额。 改善用户体验:用…

Java异常处理详解【入门篇】

Java异常处理详解【入门篇】 Java异常处理详解1. 异常的概念2. 异常的分类2.1 检查异常(Checked Exception)2.2 非检查异常(Unchecked Exception)2.3 错误(Error) 3. 异常处理机制3.1 try-catch3.2 finally…

1/7精确到100位,1000位,100000位怎么算?

双精度 Console.WriteLine("1/7的值是" (double)1 / 7);结果:0.14285714285714285 即使使用双精度浮点数,精确的位数也是有限的,如果想精确到小数点后100位,1000位,甚至更高哪? 朴素的除法 除数 余数 商…

麒麟桌面系统CVE-2024-1086漏洞修复

原文链接:麒麟桌面操作系统上CVE-2024-1086漏洞修复 Hello,大家好啊!今天给大家带来一篇在麒麟桌面操作系统上修复CVE-2024-1086漏洞的文章。漏洞CVE-2024-1086是一个新的安全漏洞,如果不及时修复,可能会对系统造成安全…

设计模式 - Observer Pattern 观察者模式

文章目录 定义观察者模式的实现构成构成UML图 观察者模式的代码实现场景代码实现 总结优点缺点应用场景 其他设计模式文章: 定义 观察者模式是行为型模式的一种,它定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,它…

ThreadPoolExecutor线程池创建线程

线程池介绍 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源&#…

find()方法——字符串首次出现的索引位置

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 find()方法实现查询一个字符串在其本身字符串对象中首次出现的索引位置,如起始位置从11到结束位置17之间子字符串出现的位置&a…

Profinet IO从站数据 转EtherCAT项目案例

这里是引用 目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 使用PRONETA软件获取PROFINET IO从站的配置信息 2 5 设置网关采集PROFINETIO从站设备数据 5 6 启动ETHERCAT从站转发采集的数据 8 7 选择槽号和数据地址 9 8 选择子槽号 11 9 案例总结 12 1 案例说明 设置…

【shell脚本实战案例】主机状态监控脚本

文章目录 案例需求脚本应用场景解决问题脚本思路实现代码 🌈你好呀!我是 山顶风景独好 🎈欢迎踏入我的博客世界,能与您在此邂逅,真是缘分使然!😊 🌸愿您在此停留的每一刻&#xff0c…

统计信号处理基础 习题解答11-6

题目 考虑例11.1对WGN中单个正弦信号的数据模型,将模型重写为 其中: ,证明A的PDF是瑞丽的,的PDF是,且和是相互独立的。 解答 根据例11.1: 由于N维联合高斯分布为: 由: 因此&#…

ProfibusDP主站转Modbus模块连接称重仪配置案例

在工业自动化领域,常常需要将不同协议的设备进行连接。比如,将ProfibusDP主站转Modbus模块(XD-MDPBM20)用于连接称重仪,可以实现不同设备之间的数据交换和通信。ProfibusDP主站转Modbus网关(XD-MDPBM20&…

一招教你用python代码给朋友写一个爱心代码

有人问我马上要跟女朋友一周年了,能不能用代码给他写一个爱心代码呢?那算你问对人了,来上才艺 可以使用Python的turtle模块来绘制一个爱心形状。下面是一个简单的示例代码,我将详细解释每一步: import turtle # 创建一…

(已解决)Adobe Flash Player已不再受支持

文章目录 前言解决方案 前言 一般来说,很少遇到官方网站使用Adobe Flash Player来进行录用名单公示了。但是,今天就偏偏遇到一次, 用谷歌浏览器打不开, 点了没有反应,用其他的浏览器,例如windows自带的那…

【方案+源码】srm供应商招投标管理系统建设方案及源码实现

SRM供应商管理系统功能建设涵盖: 供应商管理:整合供应商信息,实现全生命周期管理。 采购需求管理:精准把握采购需求,优化采购计划。 采购寻源管理:智能寻源,匹配最佳供应商。 采购合同管理&…

【nvm】如何使用nvm优雅的管理Node.js

希望文章能给到你启发和灵感~ 如果觉得文章对你有帮助的话,点赞 关注 收藏 支持一下博主吧~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、什么是nvm?2.1 概念2.1 安装2.1.1 对于Mac系统2.1.2 对于Windows系统2.1.3 对于…

AWS云中的VPC启用流日志保存S3(AWS中国云)

问题 需要在AWS中国云中对VPC启用流日志操作。 步骤 创建s3桶 这里设置一个s3桶名,创建即可。如果出现已存在具有相同名称的存储桶错误,就换个桶名再试一试吧。 启用vpc流日志 找到vpc流日志入口操作,如下图: 设置vpc流日志…

Redis的使用和原理

目录 1.初识Redis 1.1 Redis是什么? 1.2 Redis的特性 1.2.1 速度快 1.2.2 基于键值对的数据结构服务器 1.2.3 丰富的功能 1.2.4 简单稳定 1.2.5 持久化 1.2.6 主从复制 1.2.7 高可用和分布式 1.3 Redis的使用场景 1.3.1 缓存 1.3.2 排行榜系统 1.3.3 计数器应用 1.3…

制定班规要注意哪些事项

对于如何管理班级,制定班规是一项至关重要的任务。关系到班级的日常秩序,影响着学生的集体荣誉感。制定班规并非易事,需要深思熟虑和周全考虑。 班规的制定应以学生为中心。深入了解学生的需求和期望,以及他们在学习和生活中可能遇…

Docker基础知识的掌握,相关基本命令的用法

安装docker步骤:https://b11et3un53m.feishu.cn/wiki/Rfocw7ctXij2RBkShcucLZbrn2d 1.docker Docker 是一种容器化平台,用于帮助开发者打包、发布和管理应用程序及其依赖关系。通过 Docker,开发者可以将应用程序及其所有依赖项打包到一个称为…