nodejs:如何使用较新的openssl编译grpc?

时间:2019-06-11 09:41:34

标签: node.js openssl grpc

我想在nodejs项目中使用较新的openssl(> = 1.1.0)编译grpc,但是我不知道如何与之相处。

这是整个项目中的package.json

{
    "name": "fabcar",
    "version": "1.0.0",
    "description": "FabCar application implemented in JavaScript",
    "engines": {
        "node": ">=8",
        "npm": ">=5"
    },
    "scripts": {
        "lint": "eslint .",
        "pretest": "npm run lint",
        "test": "nyc mocha --recursive"
    },
    "engineStrict": true,
    "author": "Hyperledger",
    "license": "Apache-2.0",
    "dependencies": {
        "fabric-ca-client": "~1.4.0",
        "fabric-network": "~1.4.0"
    },
    "devDependencies": {
        "chai": "^4.2.0",
        "eslint": "^5.9.0",
        "mocha": "^5.2.0",
        "nyc": "^13.1.0",
        "sinon": "^7.1.1",
        "sinon-chai": "^3.3.0"
    },
    "nyc": {
        "exclude": [
            "coverage/**",
            "test/**"
        ],
        "reporter": [
            "text-summary",
            "html"
        ],
        "all": true,
        "check-coverage": true,
        "statements": 100,
        "branches": 100,
        "functions": 100,
        "lines": 100
    }
}

在这个项目中,fabrc-ca-clientfabric-network将使用grpc

这是一些环境:

$ npm version

{ npm: '6.4.1',
  ares: '1.10.1-DEV',
  cldr: '32.0',
  http_parser: '2.8.0',
  icu: '60.1',
  modules: '57',
  napi: '4',
  nghttp2: '1.33.0',
  node: '8.16.0',
  openssl: '1.0.2r',
  tz: '2017c',
  unicode: '10.0',
  uv: '1.23.2',
  v8: '6.2.414.77',
  zlib: '1.2.11' }

$ node -v
v8.16.0

请帮助compile grpc in nodejs with newer openssl(>=1.1.0)

我正在使用Ubuntu 18.04,只需要在Linux上构建即可。

任何建议都会很棒!

谢谢!

1 个答案:

答案 0 :(得分:2)

使用不同的OpenSSL库构建grpc存在三个主要障碍。首先,Node.js已经导出了本机模块要动态链接的OpenSSL符号。这意味着您将无法动态链接自己的OpenSSL库。这会导致符号冲突错误。您需要静态链接库,并确保隐藏符号。这可能需要显式链接相关的.a文件(如果已有的话),或者在构建过程中从源代码编译库。对于Windows或Electron而言,这不是问题,因此在这种情况下,您应该能够摆脱动态链接的局面

第二,OpenSSL标头包含在构建诸如grpc之类的本机插件时默认包含的Node标头中。如果要使用自己的OpenSSL版本,则需要为该版本使用自己的标头,而不是那些标头。当前,我们需要执行此操作才能在Windows库中使用BoringSSL,因此我们已经node-gyp下载了标头,然后进入并删除了openssl目录,然后构建了真实的库。在这种情况下,您可能也需要这样做。在Electron上这不是问题。

第三,grpc被编写为在OpenSSL中使用各种特定的API。根据您要使用的其他版本,它可能会不兼容。我不确定这里的可用版本范围是什么,但这是要牢记的。

如果您可以解决所有这些问题,则需要对grpc的binding.gyp文件进行一些重要的编辑才能完成此操作。如果要从源代码构建OpenSSL,则现有的boringssl目标应该是一个很好的模板。您可以为openssl添加一个类似的目标,然后使grpc目标依赖于它。如果您已经有一个.a文件,则应该能够向grpc目标添加链接器标志以进行链接。无论哪种情况,请确保在文件的各个部分中删除对其他OpenSSL标头的引用。