我想在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-client
,fabric-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上构建即可。
任何建议都会很棒!
谢谢!
答案 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标头的引用。