Ошибка JS при выполнении приложения electron с собственным модулем на другом компьютере

#reactjs #opencv #electron

#reactjs #opencv #electron

Вопрос:

Я использую opencv4nodejs (собственный модуль) в своем приложении electron.

Когда я упаковываю свое приложение и пытаюсь запустить его на другом компьютере, я получаю следующую ошибку:

 A JavaScript error occurred in the main process
Uncaught Exception:
Error: dlopen(/var/folders/7m/klqbsvis2iqg_mb_pdvv79fhO000gn/
T/.app.repeato.uuz70R, 1): Library not loaded: @rpath/
libopency_core.3.4.dylib
 Referenced from: /var/folders/7m/kiqbsvis2iqg_mb_pdvv79fhOG00gn/
Tf.app.repeato.uuz70R
 Reason: image not found
  at process.module.(anonymous function) (as dlopen} (ELECTRON_ASAR.js:166:20)
  at Object.Module._extensions..node (internal/modules/cjsfosder.js:740:18)
  at Object.module.(anonymous function) [as .node] (ELECTRON_ASAR.js:180:18)
  at Module.load (internal{modules/cjsfoader.js:620:32)
  at tryModuleLoad (internal/modules/cjs/loader.js:559:12)
  at Function.Madule._load {internal/modules/cjs/loader.js:551:3)
  at Module.require (internal/modules/cjs/loader.js:658:17)
  at require (internal/modules/cjs/helpers.js:20:18)
  at Object.<anonymous> (/Applications/Repeato.app/Contents/Resources/app.asar/node_modules/opencv4nodejs/lib/cv.js:17:8)
  at Object.<anonymous> (/Applications/Repeato.app/Contents/Resources/app.asar/node_modules/opencv4nodejs/lib/cv.js:28:3)
  

Есть идеи, что не так?
Я обнаружил очень похожую проблему на github, но не уверен, действительно ли это так

Редактировать

Я создаю с помощью electron-builder и создаю с помощью команды npm run dist . Вот мой package.json:

 {
  "name": "Repeato",
  "description": "...",
  "version": "1.0.0",
  "author": {
    "name": "...",
    "email": "..."
  },
  "repository": {
    "type": "git",
    "url": "..."
  },
  "build": {
    "appId": "app.myapp",
    "productName": "Repeato",
    "mac": {
      "category": "public.app-category.developer-tools"
    },
    "files": [
      "!minicap/*",
      "!minitouch/*"
    ],
    "extraResources": [
      "minicap/**",
      "minitouch/**"
    ],
    "directories": {}
  },
  "scripts": {
    "electron-rebuild": "electron-rebuild -w opencv4nodejs",
    "clean": "rm -rf node_modules",
    "reinstall": "npm run clean amp;amp; npm install",
    "start": "concurrently "npm run start-dev" "npm run start-electron"",
    "start-dev": "cross-env NODE_ENV=development webpack-dev-server",
    "start-electron": "cross-env NODE_ENV=development electron index",
    "build": "npm run dist amp;amp; npm run build-all",
    "bundle": "cross-env NODE_ENV=production webpack  --config webpack.production.config.js",
    "build-all": "build -lmw",
    "test": "ELECTRON_RUN_AS_NODE=true ./node_modules/.bin/electron ./node_modules/.bin/jest",
    "prettier": "prettier --write app/**/*.js",
    "prettier:staged": "pretty-quick --staged",
    "postinstall": "electron-builder install-app-deps",
    "pack": "npm run bundle amp;amp; electron-builder --dir",
    "dist": "npm run bundle amp;amp; electron-builder"
  },
  "keywords": [
    "android",
    "UI testing"
  ],
  "license": "ISC",
  "dependencies": {
    "@devexpress/dx-react-core": "^1.10.5",
    "@devexpress/dx-react-grid": "^1.10.5",
    "@devexpress/dx-react-grid-material-ui": "^1.10.5",
    "@material-ui/core": "^3.9.1",
    "@material-ui/icons": "^3.0.2",
    "classnames": "^2.2.6",
    "fix-path": "^2.1.0",
    "lodash": "^4.17.11",
    "minimist": "^1.2.0",
    "mobx-state-tree": "^3.10.0",
    "node-loader": "^0.6.0",
    "opencv4nodejs": "^4.11.0",
    "react-image-crop": "^6.0.18",
    "react-sizeme": "^2.5.2",
    "rxjs": "^6.3.3",
    "typeface-roboto": "0.0.54",
    "ws": "^6.1.2"
  },
  "devDependencies": {
    "babel-core": "^6.26.3",
    "babel-loader": "^7.1.5",
    "babel-plugin-transform-decorators-legacy": "^1.3.5",
    "babel-polyfill": "^6.26.0",
    "babel-preset-env": "^1.7.0",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-react": "^6.24.1",
    "babel-preset-stage-0": "^6.24.1",
    "concurrently": "^3.6.1",
    "cross-env": "^5.2.0",
    "css-loader": "^0.28.11",
    "electron": "^3.1.1",
    "electron-builder": "^20.28.4",
    "electron-devtools-installer": "^2.2.4",
    "electron-prebuilt-compile": "^3.0.10",
    "electron-rebuild": "^1.8.2",
    "html-webpack-plugin": "^3.2.0",
    "husky": "^1.3.1",
    "jest": "^23.6.0",
    "mobx": "^4.8.0",
    "mobx-react": "^5.4.3",
    "mobx-react-devtools": "^6.0.3",
    "prettier": "^1.16.4",
    "pretty-quick": "^1.10.0",
    "react": "^16.5.1",
    "react-dom": "^16.5.1",
    "react-hot-loader": "^4.6.3",
    "react-router": "^4.3.1",
    "react-router-dom": "^4.3.1",
    "style-loader": "^0.21.0",
    "webpack": "^4.27.1",
    "webpack-cli": "^3.1.2",
    "webpack-dev-server": "^3.1.14"
  }
}
  

И мой webpack.production.config.js

 const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  entry: {
    main: ['babel-polyfill', './app/index'],
    worker: ['babel-polyfill', './app/worker.js']
  },
  mode: 'production',
  output: {
    filename: '[name]-bundle.js',
    path: path.resolve(__dirname, 'static'),
    publicPath: '/static/'
  },
  module: {
    rules: [
      {
        test: /.node$/,
        use: 'node-loader'
      },
      {
        test: /.js$/,
        exclude: /(node_modules|bower_compontents)/,
        use: ['babel-loader']
      },
      {
        test: /.css$/,
        use: ['style-loader', 'css-loader']
      }
    ]
  },
  plugins: [
    new webpack.NamedModulesPlugin(),
    new webpack.NoEmitOnErrorsPlugin(),
    new HtmlWebpackPlugin({ template: 'index.html', inject: false }),
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify('production')
    })
  ],
  target: 'electron-renderer'
}
  

Комментарии:

1. Можете ли вы опубликовать, как вы запустили проект?

2. Собственные модули в основном зависят от платформы, иногда версия ОС тоже имеет значение. Таким образом, вы либо включаете правильно созданный собственный модуль в свое упакованное приложение для этого другого компьютера, либо ваша настройка должна включать сборку модуля из исходного кода на этом компьютере. Пожалуйста, убедитесь, что вы проверили.

3. @Jacob добавил некоторую информацию

4. Вы пытаетесь автоматически создать свое приложение в Windows, которое не работает?

5. Может быть, ваш модуль является частью зависимостей разработчика?

Ответ №1:

Вы должны связать свое приложение с библиотеками общих объектов OpenCV. opencv4nodejs содержит внешние ссылки на динамическую библиотеку libopency_core.3.4.dylib вашей установки opencv. Он установлен на вашем компьютере, но он неправильно установлен на компьютере, на котором у вас возникла проблема. Вы должны отправить библиотеки общих объектов вместе с пакетом и правильно связать их.

Одной из причин может быть то, что electron-builder полностью упаковывает всю папку приложения в архивный файл asar. Это делает библиотеку недоступной для загрузки. Поместите "asar": false в файл package.json, чтобы предотвратить это, и сохраните все в папке:

 "build": {
    "asar": false,
    ...
  

Другая возможная причина заключается в том, что вы не связываете библиотеку с целью. Задайте относительный путь в binding.gyp для opencv4nodejs:

 "link_settings": {
    "libraries": [
        "-Wl,-rpath,@loader_path/../../../opencv-build/opencv/build/lib"
    ],
},
  

Я думаю, что нет способа заставить opencv4nodejs загружать общую библиотеку из архива. Если вам нужен asar, попробуйте asarUnpack библиотеки.

 "build": {
    "asarUnpack": [
        ...
    ]
    ...