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.pswp.cn/diannao/35304.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35304.shtml
英文地址,請注明出處:http://en.pswp.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的基本概念 自監督學習: 自監督學習方法通過從數據本身獲取監督信號進行學習,不…