2016-05-25 3 views
2

Я пробовал Mink (PHP) на Ubuntu 14.04; Я в основном сделал следующее:nodejs не может найти модуль 'зомби' с PHP норкой

$ 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 (а также Cannot find module 'zombie' · Issue #84 · assaf/zombie · 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 

Как я могу получить это базовый пример для запуска?


EDIT: поиграл немного больше с этим, и обнаружил, что, когда я определяю переменные окружения в командной строке:

$ 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"); на самом деле не работает для меня ...

As для новой ошибки есть Installing Zombie.js Error: ReferenceError: Set is not defined. What am I doing wrong? - видимо, это связано с несоответствием версии, что я получил предупреждение для (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:

Zombie 4.x тестируется работать с io.js 1.6 or later.
Если вам нужно использовать Node 0.12 или ранее, рассмотрите возможность использования Zombie 2.x. ...
Для установки Zombie.js вам нужно будет io.js:
`` `Баш
$ НПМ установить зомби --save-DEV
` ``

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

ответ

0

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

В любом случае, трюк - 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 в том, что он устанавливает в директории пользователя, и я хотел бы проверить мои сценарии как на моем компьютере пользователя и удаленного сервера, где мой uids совершенно разные. Несмотря на это, использование пользовательского исполняемого файла немного помогает в этом. Таким образом, создать скрипт в «глобальном» месте, я выбрал /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 "[email protected]" | tee -a /tmp/node.log 
/home/USERNAME/.nvm/versions/node/v4.0.0/bin/node "[email protected]" 

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

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(); 
?> 

... ИЛИ, я просто понял, что есть в vendor/behat/mink-zombie-driver/src/NodeJS/Server.phpsetNodeModulesPath($nodeModulesPath), поэтому мы можем полностью отказаться от прокси-сервера 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(); 

?> 

Anyways, when этот скрипт называется, он выводит:

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

... и так как нет никаких ошибок, я предполагаю, что это все хорошо сейчас ...

Смежные вопросы