Здесь я покажу, как вы можете создать собственный аддон C ++ для Node.js на z / OS.
Требуется немного усилий, но это возможно!
IBM перенесла Node.js в z / OS, чтобы вы могли запускать серверные приложения Node.js на z / OS. Вы можете скачать его с сайта IBM: IBM SDK для Node.js - z / OS - Обзор.
Мы увидим, как установить его вместе с предоставленным компилятором C / C ++, чтобы вы могли создавать собственные расширения с помощью node-gyp. Мы начнем с создания собственного дополнения Hello World на Mac, а затем создадим такое же расширение на z / OS.
Последняя перенесенная версия Node.js на z / OS - 6.17.0. Мы будем использовать последнюю версию на macOS. Собственный код аддона одинаков на обеих платформах.
Почему вас должен заинтересовать Node.js? Некоторые из причин указаны в https://www.monterail.com/blog/nodejs-development-enterprises. Зачем вам запускать его на z / OS? z / OS предоставляет безопасную, масштабируемую и доступную инфраструктуру для локальной среды. Если большая часть ваших данных находится в z / OS, от этого повысится производительность ваших приложений Node.js.
Когда вам нужно написать собственное дополнение для Node.js на z / OS? Есть две основные причины. Во-первых, это оптимизация кода, чувствительного к производительности, такого как вычисления с интенсивным использованием ЦП. Во-вторых, это взаимодействие с собственным приложением для мэйнфрейма, которое у вас есть на z / OS.
Сборка собственного надстройки Node.js на macOS
Начнем с платформы, которую используют многие разработчики. Вы можете пропустить этот раздел, если вы уже знакомы с этим процессом в macOS, Linux или Windows.
Мы создадим пример аддона из https://github.com/nodejs/node-addon-examples/tree/master/1_hello_world/nan.
В этом примере используется nan - основанная на C ++ абстракция между Node и прямыми API V8. Это очень просто и печатает только:
world
Сначала нам нужно получить исходный код:
git clone https://github.com/nodejs/node-addon-examples.git
Затем смените каталог на пример:
cd node-addon-examples/1_hello_world/nan/
Если у вас еще не установлен Node.js, вы можете использовать Homebrew для его установки:
brew install node
В вашей системе должен быть компилятор C ++. Вам необходимо установить Инструменты командной строки через Xcode:
xcode-select --install
Следующим шагом будет компиляция собственного аддона:
npm install
Вы должны получить аналогичный результат:
> [email protected] install /Users/petrplavjanik/workspace/node-addon-examples/1_hello_world/nan > node-gyp rebuild CXX(target) Release/obj.target/hello/hello.o SOLINK_MODULE(target) Release/hello.node audited 2 packages in 3.677s found 0 vulnerabilities
Вы готовы выдать node hello.js
и получить world
.
Прежде чем мы сможем сделать то же самое в z / OS, нам нужно установить Node.js в z / OS со всеми необходимыми условиями.
Установка Node.js на z / OS
У вас должны быть все предварительные условия, перечисленные на странице https://www.ibm.com/support/knowledgecenter/en/SSTRRS_6.0.0/com.ibm.nodejs.zos.v6.doc/install.htm:
- z / OS V2R2 с PTF UI46658, z / OS V2R3 или выше
- В системах, где запущен SDK для Node.js, должен быть включен Integrated Cryptographic Services Facility (ICSF).
- Python 2.7.13 или выше, предоставляемый Rocket Software. Обратите внимание, что Python 3.x несовместим с node-gyp, который используется для создания собственных надстроек.
- GNU Make 4.1 или выше, предоставляемый Rocket Software
- Bash 4.3 или выше, который предоставляется Rocket Software и требуется для установки Python 2.7.
- Gzip 1.9 или выше, предоставляемый Rocket Software и необходимый для распаковки другого программного обеспечения, предоставляемого Rocket Software.
Загрузки с открытым исходным кодом Rocket Software доступны по адресу https://my.rocketsoftware.com/RocketCommunity#/downloads.
Если вы используете пробную версию Node.js для z / OS с https://developer.ibm.com/node/sdk/ztp/ вместо установленной версии SMP / E, тогда вам понадобится Perl 5.24.0 или выше. который также предоставляется Rocket Software.
Поскольку нужно сделать много шагов, и они описаны в нескольких руководствах в разных местах, мы рассмотрим их все здесь.
Мы будем использовать Zowe CLI, чтобы упростить взаимодействие с z / OS. Вы можете установить Zowe CLI, следуя инструкциям на странице https://zowe.github.io/docs-site/latest/user-guide/cli-installcli.html#installing-zowe-cli-from-an-online-registry. Включая настройку профиля z / OSMF. Если у вас нет Zowe CLI или z / OSMF, вы можете выполнить все шаги вручную.
Загрузка программного обеспечения Rocket Software с открытым исходным кодом
Мы скачаем все архивы перед их установкой. Загрузите их все в один каталог.
- Перейдите на https://my.rocketsoftware.com/RocketCommunity#/downloads
- Войдите или зарегистрируйтесь в сообществе Rocket
- Найдите
make
и загрузитеmake-4.1_b0002.160426.tar.gz
- Найдите
python
и загрузитеpython-2017–04–12-py27.tar.gz
- Найдите
perl
и загрузитеperl-5.24.0_b007.180202.tar.gz
- Найдите
bash
и загрузитеbash-4.3_b018.170518.tar.gz
- Найдите
gzip
и загрузитеgzip-1.9-edc_b002.180703.tar
Создание файловой системы zFS для программного обеспечения Rocket Software с открытым исходным кодом и Node.js
Вам понадобится около 4 ГБ места. Рекомендуется выделить для него новую файловую систему zFS. Вы можете использовать следующий шаблон задания и заменить переменные ${jobcard}
и ${prefix}
своей карточкой задания и префиксом для наборов данных с файловой системой zFS.
Вы можете легко отправить этот JCL с помощью Zowe CLI:
curl -O https://gist.githubusercontent.com/plavjanik/fbf4fbf4318a1b7a44ac0381a1a39717/raw/19cc8feabd757549e719bb6c1e49b1dc9f6d9986/create_zfs.jcl
Отредактируйте файл в своем любимом текстовом редакторе и замените переменные. Затем вы можете отправить его:
zowe zos-jobs submit local-file create_zfs.jcl
Попробуйте Zowe CLI! Он позволяет вам взаимодействовать с заданиями z / OS, наборами данных, файлами z / OS UNIX и многим другим с вашей рабочей станции:
После завершения работы вам необходимо смонтировать файловую систему. Войдите в свою систему z / OS через ssh или Putty. Выполните следующую команду (необходимо заменить переменные ${rocket_home}
и ${prefix}
):
export ROCKET_HOME=${rocket_home} mkdir ${ROCKET_HOME} /usr/sbin/mount -f ${prefix}.ZFS ${ROCKET_HOME} cd ${ROCKET_HOME} mkdir download
Теперь вам нужно вернуться к терминалу вашей рабочей станции и скопировать пакеты в zFS:
zowe zos-files upload file-to-uss --binary gzip-1.9-edc_b002.180703.tar ${ROCKET_HOME}/download/gzip-1.9-edc_b002.180703.tar zowe zos-files upload file-to-uss --binary perl-5.24.0_b007.180202.tar.gz ${ROCKET_HOME}/download/perl-5.24.0_b007.180202.tar.gz zowe zos-files upload file-to-uss --binary python-2017-04-12-py27.tar.gz ${ROCKET_HOME}/download/python-2017-04-12-py27.tar.gz zowe zos-files upload file-to-uss --binary make-4.1_b0002.160426.tar.gz ${ROCKET_HOME}/download/make-4.1_b0002.160426.tar.gz
Вернитесь в сеанс оболочки z / OS и распакуйте эти пакеты:
tar -C ${ROCKET_HOME} -xovf ${ROCKET_HOME}/download/gzip-1.9-edc_b002.180703.tar ${ROCKET_HOME}/bin/gunzip --stdout {ROCKET_HOME}/download/perl-5.24.0_b007.180202.tar.gz | tar xoUXf - ${ROCKET_HOME}/bin/gunzip --stdout ${ROCKET_HOME}/download/python-2017-04-12-py27.tar.gz | tar xoUXf - ${ROCKET_HOME}/bin/gunzip --stdout ${ROCKET_HOME}/download/bash-4.3_b018.170518.tar.gz | tar xoUXf - ${ROCKET_HOME}/bin/gunzip --stdout ${ROCKET_HOME}/download/make-4.1_b0002.160426.tar.gz | tar xoUXf - ${ROCKET_HOME}/bin/gunzip --stdout ${ROCKET_HOME}/download/python-2017-04-12-py27.tar.gz | tar xoUXf -
Пришло время назначить правильные права доступа:
chmod -R 755 ${ROCKET_HOME}/bin/* find ${ROCKET_HOME}/lib -type f -exec chmod 644 {} \\; find ${ROCKET_HOME}/lib -type f -name '*.so' -exec chmod 755 {} \\;
Нам нужно установить переменные среды, прежде чем эти инструменты будут доступны для чтения. Для них требуется автоматическое преобразование.
Вот рекомендуемые настройки:
Вам нужно поместить их в каталог в zFS:
curl -O https://gist.githubusercontent.com/plavjanik/94d859826f5064691266406c1d431037/raw/249265ad8b71a4aef1e3140322ec613789024ea4/rocket_activate.sh # edit rocket_activate.sh and replace ${rocket_home} zowe zos-files upload file-to-uss rocket_activate.sh ${rocket_home}/rocket_activate.sh
Затем вы можете сделать его активным в оболочке z / OS:
. ${ROCKET_HOME}/rocket_activate.sh
Вы можете поместить эту строку в свой ~/.profile
, если хотите, чтобы она активировалась для каждого сеанса.
Последний шаг - завершить установку Python:
export BASH_PREFIX=${ROCKET_HOME}/bin export PERL_PREFIX=${ROCKET_HOME}/bin export RELEASE_NAME=python-2017-04-12 export RELEASE_TYPE=py27 export RELEASE_DIR=${ROCKET_HOME}/${RELEASE_NAME}-${RELEASE_TYPE} export PKGS_BASE=${RELEASE_DIR}/pkgs cd ${PY_RELEASE_DIR}/python27; bin/install_all_packages
Если все в порядке, удалите пакеты:
rm -Rf download
Загрузите и установите Node.js для z / OS
Теперь мы готовы установить Node.js для z / OS. Загрузите файл PAX с https://developer.ibm.com/node/sdk/ztp/.
Загрузите файл PAX ibm-6.17.0.0-trial-node-v6.17.0-os390-s390x.pax.Z
в zFS.
zowe zos-files upload file-to-uss --binaryibm-6.17.0.0-trial-node-v6.17.0-os390-s390x.pax.Z
${rocket_home}/ibm-6.17.0.0-trial-node-v6.17.0-os390-s390x.pax.Z
В оболочке z / OS:
cd ${ROCKET_HOME}
pax -rf ibm-6.17.0.0-trial-node-v6.17.0-os390-s390x.pax.Z
-x pax
Node.js установлен для запуска приложений, но нам нужно заставить работать компилятор Node.js SDK C / C ++. Это можно сделать с помощью unpack.pl
сценария, но для правильной работы этот сценарий требует обновлений вручную.
Вы можете скачать его по следующей ссылке: https://pastebin.com/MJDDeF1u
curl https://pastebin.com/raw/MJDDeF1u > unpack2.pl zowe zos-files upload file-to-uss unpack2.pl ${rocket_home}/node-v6.17.0-os390-s390x/unpack2.pl
On z/OS:
cd ${ROCKET_HOME}/node-v6.17.0-os390-s390x ln -s bin/njsc++ bin/g++ chmod a+x *.pl COMPILER_INSTALL_ACCOUNT_NUMBER=${account_number} COMPILER_INSTALL_MSGCLASS=X COMPILER_INSTALL_HLQ=${rocket_hlq}.CC COMPILER_INSTALL_VOLSER=${volser} perl ./unpack2.pl
Например:
COMPILER_INSTALL_ACCOUNT_NUMBER=129300000 COMPILER_INSTALL_MSGCLASS=X COMPILER_INSTALL_HLQ=MFAAS.NODE.CC COMPILER_INSTALL_VOLSER=TSU001 perl ./unpack2.pl
Это займет некоторое время, и в конце вы должны увидеть следующее сообщение:
Hello C++ World! <INFO> installation complete!
Если вы не видите это сообщение, проверьте два задания, которые были отправлены этим сценарием.
Среда C / C ++ поставляется предварительно настроенной при использовании npm для создания собственных надстроек. Однако, если вы вызываете node-gyp напрямую для сборки собственного кода, необходимо установить следующие переменные среды компилятора C / C ++:
export CC=eb2as.sh
export CXX=eb2as.sh
export LINK=eb2as.sh
export _C89_CCMODE=1
export _CC_CCMODE=1
export _CXX_CCMODE=1
Вы должны добавить следующие строки в сценарий оболочки активации rocket_activate.sh
:
# Node.js: NODE_VERSION="v6.17.0" export NODE_HOME=${ROCKET_HOME}/node-${NODE_VERSION}-os390-s390x export PATH=${NODE_HOME}/bin:$PATH export LIBPATH=${NODE_HOME}/lib:${LIBPATH} export MANPATH=${NODE_HOME}/man/:${MANPATH} export CC=eb2as.sh export CXX=eb2as.sh export LINK=eb2as.sh export _C89_CCMODE=1 export _CC_CCMODE=1 export _CXX_CCMODE=1
И активируйте его:
. ${ROCKET_HOME}/rocket_activate.sh mkdir -p 1_hello_world/nan
Убедитесь, что работает, выполнив node --version
, который должен вернуть v6.17.0
.
Сборка собственного дополнения на z / OS
Перейдите в каталог с образцом надстройки на вашей рабочей станции:
cd node-addon-examples/1_hello_world/nan/
Скопируйте исходные файлы в z / OS:
zowe zos-files upload file-to-uss binding.gyp ${rocket_home}/1_hello_world/nan/binding.gyp zowe zos-files upload file-to-uss hello.cc ${rocket_home}/1_hello_world/nan/hello.cc zowe zos-files upload file-to-uss hello.js ${rocket_home}/1_hello_world/nan/hello.js zowe zos-files upload file-to-uss package.json ${rocket_home}/1_hello_world/nan/package.json
Мы готовы построить его на z / OS:
cd ${ROCKET_HOME}/1_hello_world/nan npm install --nodedir=${NODE_HOME}
Параметр --nodedir=${NODE_HOME}
важен, потому что он заставляет node-gyp использовать заголовки C ++ из Node.js в z / OS вместо загрузки версии not-z / OS из Интернета.
Тогда можете выдать node hello.js
.
Результат должен быть world
!
В будущем мы будем работать с наборами данных VSAM из приложения Node.js и создадим простую службу API на z / OS, которая считывает и хранит данные в наборах данных VSAM vsam.js и Express. Мой напарник Дэн Келоски покажет вам, как использовать NestJS с TypeScript на z / OS.
Вы готовы воспользоваться преимуществами экосистемы Node.js и npm: https://www.monkeyuser.com/2017/npm-delivery/ 😊
Ссылки
- Документация IBM Node.js SDK для z / OS - https://www.ibm.com/support/knowledgecenter/en/SSTRRS_6.0.0/com.ibm.nodejs.zos.v6.doc/welcome.html
- IBM SDK для Node.js - пробная версия z / OS - https://developer.ibm.com/node/sdk/ztp/
- Примеры надстроек C ++ для Node.js из http://nodejs.org/docs/latest/api/addons.html - https://github.com/nodejs/node-addon-examples