nodejs: как скомпилировать grpc с более новым openssl? - PullRequest
0 голосов
/ 11 июня 2019

Я хотел бы скомпилировать grpc с более новым openssl (> = 1.1.0) в проекте nodejs, но я не знаю, как с этим справиться.

Вот 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.

вот некоторые env:

$ 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 Ответ

2 голосов
/ 11 июня 2019

Существует три основных препятствия для построения grpc с другой библиотекой OpenSSL.Во-первых, Node.js уже экспортирует символы OpenSSL для собственных модулей, чтобы динамически связываться с ними.Это означает, что вы не сможете динамически связывать свою собственную библиотеку OpenSSL;это приведет к ошибкам столкновения символов.Вам необходимо статически связать библиотеку и обязательно скрыть символы.Это может потребовать либо явной ссылки на соответствующий файл .a, если он у вас уже есть, либо компиляции библиотеки из исходного кода в рамках процесса сборки.Это не проблема при сборке для Windows или для Electron, так что вы должны иметь возможность обойтись без динамического связывания в этих случаях

Во-вторых, заголовки OpenSSL включены в заголовки узла, которые включаются по умолчанию присоздание нативных аддонов типа grpc.Если вы хотите использовать свою собственную версию OpenSSL, вам нужно будет использовать свои собственные заголовки для этой версии вместо этих заголовков.В настоящее время нам нужно сделать это, чтобы использовать BoringSSL в библиотеке Windows, поэтому мы node-gyp скачиваем заголовки, затем идем и удаляем каталог openssl, а затем собираем библиотеку по-настоящему.Вам, вероятно, придется сделать это и в этой ситуации.Это не проблема для Electron.

В-третьих, grpc написан для использования различных специфических API в OpenSSL.В зависимости от того, какую другую версию вы хотите использовать, есть вероятность, что она не будет совместимой.Я не уверен, какой диапазон доступных версий здесь, но об этом следует помнить.

Если вы можете решить все эти проблемы, вам нужно будет внести некоторые существенные изменения в файл binding.gyp grpc.чтобы сделать это.Если вы создаете OpenSSL из исходного кода, существующая цель boringssl должна быть хорошим шаблоном.Вы можете добавить аналогичную цель для openssl, и тогда цель grpc будет зависеть от нее.Если у вас уже есть файл .a, вы сможете добавить флаг компоновщика к цели grpc, чтобы связать его.В любом случае не забудьте удалить ссылки на другие заголовки OpenSSL в различных частях файла.

...