简体   繁体   English

使用`node-ffi`时如何解决`错误:找不到绑定文件。`?

[英]How can I resolve `Error: Could not locate the bindings file.` when using `node-ffi`?

Some details:一些细节:

  • Mac OSX 10.11.6 Mac OSX 10.11.6
  • Node v6.5.0节点 v6.5.0
  • npm v3.10.3 npm v3.10.3
  • nvm v0.29.0 nvm v0.29.0

I recently built an npm package that interacts with a shared C library using ffi .我最近构建了一个npm包,它使用ffi与共享的 C 库交互。 The package works perfectly on its own (built with babel ).该软件包可以完美运行(使用babel构建)。 I'm trying to integrate it into a proof-of-concept app and am running into lots of problems with bindings .我正在尝试将它集成到一个概念验证应用程序中,并且遇到了很多bindings问题。 I'm using webpack to bundle my POC app and that's where I'm running into this issue.我正在使用webpack来捆绑我的 POC 应用程序,这就是我遇到这个问题的地方。

Here's my webpack.config.js :这是我的webpack.config.js

/* eslint-disable */
var webpack = require('webpack');
var path = require('path');
var HtmlWebpackPlugin = require('html-webpack-plugin');

var buildPath = path.resolve(__dirname, 'wp-build/');

module.exports = [
  {
    name: 'frontend',
    entry: './src/frontend/index.js',
    output: {
      path: buildPath,
      filename: 'frontend.bundle.js',
    },
    module: {
      loaders: [{
        test: /\.js/,
        exclude: /(node_modules|build)/,
        loader: 'babel-loader',
      }],
    },
    plugins: [
      new HtmlWebpackPlugin(),
    ],
    devServer: {
      contentBase: buildPath,
      filename: 'frontend.bundle.js',
      publicPath: '/assets/',
      port: 8000,
      stats: {
        colors: true,
      },
    },
  },
  {
    name: 'backend',
    entry: './src/backend/server.js',
    output: {
      path: buildPath,
      filename: 'backend.bundle.js',
    },
    module: {
      loaders: [{
        test: /\.js/,
        exclude: /(node_modules|build|\.json|\.md)/,
        loader: 'babel-loader',
      }],
    },
    options: {
      symlinks: true,
    },
    target: 'node',
  },
];

The frontend task builds a bundle from this Javascript (ES6): frontend任务从这个 Javascript (ES6) 构建一个包:

console.log('This is the frontend calling!!');

Simple right?简单吧?

The backend task builds a bundle from this Javascript (ES6): backend任务从这个 Javascript (ES6) 构建一个包:

import Stack from 'stack-vod';

const stack = new Stack();
console.log(stack);

where stack-vod is my package that's using ffi .其中stack-vod是我使用ffi包。

Here's the package.json file for the POC app:这是 POC 应用程序的package.json文件:

{
  "name": "stack-as-package",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "./node_modules/.bin/webpack",
    "dev": "./node_modules/.bin/webpack-dev-server"
  },
  "author": "Zachary Abresch <zachary.abresch@gmail.com>",
  "license": "MIT",
  "devDependencies": {
    "babel-core": "^6.17.0",
    "babel-eslint": "^7.0.0",
    "babel-loader": "^6.2.5",
    "babel-preset-es2015": "^6.16.0",
    "babel-preset-stage-0": "^6.16.0",
    "eslint": "^3.7.1",
    "eslint-config-airbnb": "^12.0.0",
    "eslint-plugin-import": "^1.16.0",
    "eslint-plugin-jsx-a11y": "^2.2.3",
    "eslint-plugin-react": "^6.4.1",
    "html-webpack-plugin": "^2.22.0",
    "webpack": "^1.13.2",
    "webpack-dev-server": "^1.16.2"
  },
  "dependencies": {
    "stack-vod": "[Private Gitlab Repository]"
  }
}

Here are the steps to replicate the issue:以下是重现问题的步骤:

  1. npm i
  2. npm run build
  3. node ./wp-build/backend.bundle.js

Step 1 works fine.第 1 步工作正常。 Save for a few warnings, no errors when installing npm packages.保存一些警告,安装npm包时没有错误。

Step 2 Shows this output:步骤 2显示此输出:

> stack-as-package@1.0.0 build /Users/zabresch/Documents/8x8/scratching/stack-as-package
> webpack

Hash: 513274db1b2b97352c7b3aed8d398daba0b6527f
Version: webpack 1.13.2
Child frontend:
    Hash: 513274db1b2b97352c7b
    Version: webpack 1.13.2
    Time: 859ms
                 Asset       Size  Chunks             Chunk Names
    frontend.bundle.js    1.45 kB       0  [emitted]  main
            index.html  191 bytes          [emitted]
        + 1 hidden modules
    Child html-webpack-plugin for "index.html":
            + 3 hidden modules
Child backend:
    Hash: 3aed8d398daba0b6527f
    Version: webpack 1.13.2
    Time: 949ms
                Asset    Size  Chunks             Chunk Names
    backend.bundle.js  137 kB       0  [emitted]  main
        + 40 hidden modules

    WARNING in ./~/bindings/bindings.js
    Critical dependencies:
    76:22-40 the request of a dependency is an expression
    76:43-53 the request of a dependency is an expression
     @ ./~/bindings/bindings.js 76:22-40 76:43-53

    WARNING in ./~/bindings/package.json
    Module parse failed: /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/bindings/package.json Unexpected token (2:9)
    You may need an appropriate loader to handle this file type.
    SyntaxError: Unexpected token (2:9)
        at Parser.pp$4.raise (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:2221:15)
        at Parser.pp.unexpected (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:603:10)
        at Parser.pp.semicolon (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:581:61)
        at Parser.pp$1.parseExpressionStatement (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:966:10)
        at Parser.pp$1.parseStatement (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:730:24)
        at Parser.pp$1.parseBlock (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:981:25)
        at Parser.pp$1.parseStatement (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:709:33)
        at Parser.pp$1.parseTopLevel (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:638:25)
        at Parser.parse (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:516:17)
        at Object.parse (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:3098:39)
        at Parser.parse (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/Parser.js:902:15)
        at DependenciesBlock.<anonymous> (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModule.js:104:16)
        at DependenciesBlock.onModuleBuild (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:310:10)
        at nextLoader (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:275:25)
        at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:259:5
        at Storage.provide (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:52:20)
        at CachedInputFileSystem.readFile (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:140:24)
        at DependenciesBlock.onLoadPitchDone (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:255:7)
        at DependenciesBlock.loadPitch (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:182:27)
        at DependenciesBlock.doBuild (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:241:4)
        at DependenciesBlock.build (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModule.js:84:14)
        at Compilation.buildModule (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/Compilation.js:126:9)
        at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/Compilation.js:309:10
        at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModuleFactory.js:58:13
        at NormalModuleFactory.applyPluginsAsyncWaterfall (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/tapable/lib/Tapable.js:75:69)
        at onDoneResolving (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModuleFactory.js:38:11)
        at onDoneResolving (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModuleFactory.js:121:6)
        at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModuleFactory.js:116:7
        at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/async/lib/async.js:726:13
        at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/async/lib/async.js:52:16
     @ ./~/bindings ^\.\/.*$

    WARNING in ./~/bindings/README.md
    Module parse failed: /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/bindings/README.md Unexpected token (2:3)
    You may need an appropriate loader to handle this file type.
    SyntaxError: Unexpected token (2:3)
        at Parser.pp$4.raise (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:2221:15)
        at Parser.pp.unexpected (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:603:10)
        at Parser.pp$3.parseExprAtom (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1822:12)
        at Parser.pp$3.parseExprSubscripts (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1715:21)
        at Parser.pp$3.parseMaybeUnary (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1692:19)
        at Parser.pp$3.parseExprOp (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1656:43)
        at Parser.pp$3.parseExprOp (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1658:21)
        at Parser.pp$3.parseExprOps (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1639:17)
        at Parser.pp$3.parseMaybeConditional (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1620:21)
        at Parser.pp$3.parseMaybeAssign (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1597:21)
        at Parser.pp$3.parseExpression (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1573:21)
        at Parser.pp$1.parseStatement (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:727:47)
        at Parser.pp$1.parseTopLevel (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:638:25)
        at Parser.parse (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:516:17)
        at Object.parse (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:3098:39)
        at Parser.parse (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/Parser.js:902:15)
        at DependenciesBlock.<anonymous> (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModule.js:104:16)
        at DependenciesBlock.onModuleBuild (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:310:10)
        at nextLoader (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:275:25)
        at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:259:5
        at Storage.finished (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:38:16)
        at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/graceful-fs/graceful-fs.js:78:16
        at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:445:3)
     @ ./~/bindings ^\.\/.*$

Step 3 responds with this error:第 3 步响应此错误:

/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:2688
    throw err
    ^

Error: Could not locate the bindings file. Tried:
 → /Users/zabresch/Documents/8x8/scratching/stack-as-package/build/binding.node
 → /Users/zabresch/Documents/8x8/scratching/stack-as-package/build/Debug/binding.node
 → /Users/zabresch/Documents/8x8/scratching/stack-as-package/build/Release/binding.node
 → /Users/zabresch/Documents/8x8/scratching/stack-as-package/out/Debug/binding.node
 → /Users/zabresch/Documents/8x8/scratching/stack-as-package/Debug/binding.node
 → /Users/zabresch/Documents/8x8/scratching/stack-as-package/out/Release/binding.node
 → /Users/zabresch/Documents/8x8/scratching/stack-as-package/Release/binding.node
 → /Users/zabresch/Documents/8x8/scratching/stack-as-package/build/default/binding.node
 → /Users/zabresch/Documents/8x8/scratching/stack-as-package/compiled/6.5.0/darwin/x64/binding.node
    at bindings (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:2685:10)
    at Object.<anonymous> (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:561:52)
    at __webpack_require__ (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:20:30)
    at Object.<anonymous> (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:466:12)
    at __webpack_require__ (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:20:30)
    at Object.<anonymous> (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:80:13)
    at Object.<anonymous> (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:455:31)
    at __webpack_require__ (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:20:30)
    at Object.defineProperty.value (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:64:14)
    at __webpack_require__ (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:20:30)

I've tried a ton of "fixes" I found on SO and GH but none of them have worked.我试过一吨的“修复”的我对SO和GH找到,但他们都没有工作。 Can anyone tell me what's going on here and what can be done to fix it?谁能告诉我这里发生了什么以及可以做些什么来解决它? I've been slamming my head against this for days and 2 teammates spent days last week trying to figure this out too.几天来我一直在反对这个问题,上周有两个队友也花了几天时间试图解决这个问题。

BTW, webpack is a requirement of my team as this will eventually be used on a larger project using electron and webpack is already being used to build there.顺便说一句, webpack是我团队的一项要求,因为它最终将用于使用electron的更大项目,并且webpack已经被用于在那里构建。 So answers like "don't use webpack" won't cut the mustard.所以像“不要使用 webpack”这样的答案不会减少芥末。 :) :)

First things first, you may need a json and an md file loader, do npm i -S json-loader and npm i -S file-loader , and then update this in webpack.config.js首先,您可能需要一个 json 和一个 md 文件加载器,执行npm i -S json-loadernpm i -S file-loader ,然后在webpack.config.js 中更新它

"loaders": [{
    test: /\.js/,
    exclude: /(node_modules|build)/,
    loader: 'babel-loader',
 }, {
    test: /\.md(\?v=\d+\.\d+\.\d+)?$/,
    loader: "file"
 }, {
    test: /\.json$/,
    loader: 'json-loader'
 }]

If this does not resolve the issue, check if binding.node exists after doing this, and reply then I will update my answer.如果这不能解决问题,请在执行此操作后检查binding.node 是否存在,然后回复我将更新我的答案。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM