node.js — nodejs не может найти модуль «зомби» с PHP mink

Я пытаюсь Норка (PHP) на Ubuntu 14.04; Я в основном сделал следующее:

$ apt-show-versions nodejs
nodejs:amd64/trusty 0.10.45-1nodesource1~trusty1 uptodate
$ npm -v
2.15.1
$ sudo npm install -g zombie
npm WARN engine [email protected]: wanted: {"node":"^4.0.0"} (current: {"node":"0.10.45","npm":"2.15.1"})
...
[email protected] /usr/lib/node_modules/zombie
├── [email protected]
├── [email protected]
...

$ ls /usr/lib/node_modules/zombie/node_modules/
babel-runtime  bluebird  debug  eventsource  iconv-lite  jsdom  lodash  mime  ms  request  tough-cookie  ws

Так что, в принципе, даже если я получу предупреждение, модули собираются и должны находиться в каталоге /usr/lib/node_modules,

Тогда я делаю:

mkdir test_php_mink
cd test_php_mink/
composer require behat/mink
composer require behat/mink-zombie-driver

В качестве проверки:

test_php_mink$ ls
composer.json  composer.lock  vendor

… кажется все composer файлы есть.

Наконец, согласно http://mink.behat.org/en/latest/drivers/zombie.html (а также Не удается найти модуль «Зомби» · Выпуск № 84 · Ассаф / Зомби · GitHub), Я пытаюсь этот скрипт:

<?php

# composer autoload:
require_once __DIR__ . '/vendor/autoload.php';

echo "safe_mode: '" . ini_get("safe_mode") ."'\n"; # have PHP 5.5.9, safe_mode is removed

putenv("NODE_PATH=/usr/lib/node_modules");
echo "NODE_PATH is: '" . getenv ( "NODE_PATH" ) . "'\n"; # OK, is there

# NOPE:
#$driver = new \Behat\Mink\Driver\ZombieDriver();

$driver = new \Behat\Mink\Driver\ZombieDriver(
new \Behat\Mink\Driver\NodeJS\Server\ZombieServer()
);

$session = new \Behat\Mink\Session($driver);

// start the session
$session->start();
?>

Этот скрипт, к сожалению, все еще не работает с:

$ php test_php_mink.php
safe_mode: ''
NODE_PATH is: '/usr/lib/node_modules'
PHP Fatal error:  Uncaught exception 'RuntimeException' with message 'Server process has been terminated: (8) [
module.js:340
throw err;
^
Error: Cannot find module 'zombie'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object.<anonymous> (/path/to/test_php_mink/vendor/behat/mink-zombie-driver/bin/mink-zombie-server.js:3:14)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
]' in /path/to/test_php_mink/vendor/behat/mink-zombie-driver/src/NodeJS/Server.php:413
Stack trace:
#0 /path/to/test_php_mink/vendor/behat/mink-zombie-driver/src/NodeJS/Server.php(306): Behat\Mink\Driv in /path/to/test_php_mink/vendor/behat/mink-zombie-driver/src/NodeJS/Server.php on line 413

Как мне запустить этот базовый пример?


РЕДАКТИРОВАТЬ: немного поигрался с этим и обнаружил, что когда я указываю переменную окружения в командной строке:

$ NODE_PATH=/usr/lib/node_modules php test_php_mink.php
safe_mode: ''
NODE_PATH is: '/usr/lib/node_modules'
PHP Fatal error:  Uncaught exception 'RuntimeException' with message 'Server process has been terminated: (8) [
/usr/lib/node_modules/zombie/node_modules/jsdom/lib/jsdom/level2/html.js:238
var nonInheritedTags = new Set([
^
ReferenceError: Set is not defined
...

… тогда модуль вроде бы найден! Таким образом, мой вопрос сводится к: как я могу изменить NODE_PATH переменная окружения из моего php-скрипта, поэтому мне не нужно указывать ее в оболочке — так как, по-видимому, putenv("NODE_PATH=/usr/lib/node_modules"); у меня не очень получается …

Что касается новой ошибки, есть Установка Zombie.js Ошибка: ReferenceError: Набор не определен. Что я делаю неправильно? — видимо это из-за несоответствия версий, за которое я получил предупреждение (npm WARN engine [email protected]: wanted: {"node":"^4.0.0"} (current: {"node":"0.10.45","npm":"2.15.1"})), так что я думаю, мне придется установить nvm так что я могу установить правильную версию nodejs; и я также заметил в /usr/lib/node_modules/zombie/README.md:

Зомби 4.х протестирован для работы с io.js 1.6 или более поздняя версия.
Если вам нужно использовать Node 0.12 или более раннюю версию, рассмотрите возможность использования Zombie 2.x. …
Для установки Zombie.js вам понадобится io.js:
« `Баш
$ npm установить зомби —save-dev
« `

… и я думаю, что также может быть установлен с nvm; так что я попробую …

2

Решение

Хорошо, нашел какой-то метод, который, казалось бы, работает — но я все же хотел бы, чтобы кто-то более компетентный ответил.

В любом случае, дело в том, zombie может принять путь к nodejs двоичная; так что если вы не можете действительно передать переменные среды для nodejs из PHP, затем создайте сценарий оболочки, который установит эти переменные среды, и затем вызовите nodejs,

Сначала это была моя установка:

# remove previous
sudo npm uninstall -g zombie --save-dev
sudo apt-get remove --purge nodejs && sudo apt-get autoremove --purge

# install new
curl -o- https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash
nvm install iojs-v3.3.1
npm list -g --depth=0
nvm install 4.0.0
npm list -g --depth=0
npm -g install zombie --save-dev

Проблема с nvm это то, что он устанавливается в пользовательский каталог, и я хотел бы протестировать мои сценарии как на моей пользовательской машине, так и на удаленном сервере, где мои идентификаторы совершенно разные. В любом случае, использование собственного исполняемого файла немного помогает в этом. Итак, создайте скрипт в «глобальном» месте, я выбрал /homeтак что мне нужно sudo создать файлы там:

sudo touch /home/node_pth.sh

… затем вставьте следующее содержание:

#!/bin/bash
export NODE_PATH=/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules
#echo ARGS ARE "$@" | tee -a /tmp/node.log
/home/USERNAME/.nvm/versions/node/v4.0.0/bin/node "$@"

… конечно, заменяя пути вашими правильными; затем, наконец, сделайте его исполняемым:

sudo chmod +x /home/node_pth.sh

Теперь мы можем использовать следующее test_php_mink.php PHP-файл:

<?php

$nodeModPath = "/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules"; # correct NODE_PATH, but will not help
$nodePath = "/home/node_pth.sh"; # shell script that sets NODE_PATH, then calls node executable

echo "NODE_PATH is: '" . getenv ( "NODE_PATH" ) . "'\n"; #
putenv("NODE_PATH=".$nodeModPath);
echo "NODE_PATH is: '" . getenv ( "NODE_PATH" ) . "'\n"; # is there - but still doesn't help with call

# composer autoload:
require_once __DIR__ . '/vendor/autoload.php';

echo "safe_mode: '" . ini_get("safe_mode") ."'\n"; # have PHP 5.5.9, safe_mode is removed$driver = new \Behat\Mink\Driver\ZombieDriver(
//~ new \Behat\Mink\Driver\NodeJS\Server\ZombieServer()
# copy defaults here for everything but nodeBin;
# see vendor/behat/mink-zombie-driver/src/NodeJS/Server.php
new \Behat\Mink\Driver\NodeJS\Server\ZombieServer("127.0.0.1", 8124, $nodePath, null)
);

$session = new \Behat\Mink\Session($driver);

// start the session
$session->start();
?>

… ИЛИ, я только что понял, что есть setNodeModulesPath($nodeModulesPath) в vendor/behat/mink-zombie-driver/src/NodeJS/Server.phpТаким образом, мы можем полностью удалить исполняемый файл proxy bash:

<?php

$nodeModPath = "/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules"; # correct NODE_PATH, but will not help via putenv

echo "NODE_PATH is: '" . getenv ( "NODE_PATH" ) . "'\n"; #
putenv("NODE_PATH=".$nodeModPath);
echo "NODE_PATH is: '" . getenv ( "NODE_PATH" ) . "'\n"; # is there - but still doesn't help with call

# composer autoload:
require_once __DIR__ . '/vendor/autoload.php';

echo "safe_mode: '" . ini_get("safe_mode") ."'\n"; # have PHP 5.5.9, safe_mode is removed

$zsrv = new \Behat\Mink\Driver\NodeJS\Server\ZombieServer();
$zsrv->setNodeModulesPath($nodeModPath . "/"); # needs to end with a trailing '/'

$driver = new \Behat\Mink\Driver\ZombieDriver( $zsrv );

$session = new \Behat\Mink\Session($driver);

// start the session
$session->start();

?>

В любом случае, когда этот скрипт вызывается, он выводит:

$ php test_php_mink.php
NODE_PATH is: ''
NODE_PATH is: '/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules'
safe_mode: ''

… и так как нет ошибок, я предполагаю, что теперь все в порядке …

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]