PHP proc_open 无法处理带空格的路径?
PHP proc_open unable to handle path with spaces?
我正在尝试使用 PHING 检出 git 存储库作为构建过程的一部分。 PHING 使用 pear/versioncontrol_git 来处理 git 任务。我通往 git 的路径是 C:\Program Files\Git\bin\git.exe
.
两个命令 运行 使用此路径,<gitpath> --version
和 <gitpath> clone -q -repo=...
<gitpath> --version
工作正常。 <gitpath> clone...
给出了 C:\Program
不是有效路径的错误。我很困惑为什么当完全相同的代码可以毫无错误地执行 --version
命令时这会成为一个问题。
似乎正在发生的事情是引号被剥离,但只是有时。
这是违规代码:
public function execute($arguments = array(), $options = array())
{
$command = $this->createCommandString($arguments, $options);
$descriptorspec = array(
1 => array('pipe', 'w'),
2 => array('pipe', 'w'),
);
$pipes = array();
$resource = proc_open($command, $descriptorspec, $pipes, realpath($this->git->getDirectory()));
$stdout = stream_get_contents($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
foreach ($pipes as $pipe) {
fclose($pipe);
}
$status = trim(proc_close($resource));
if ($status) {
$message = "Some errors in executing git command . $command\n\n"
. "Output:\n"
. $stdout."\n"
. "Error:\n"
. $stderr;
var_dump($message);
throw new VersionControl_Git_Exception($message);
} else {
var_dump('No errors in ' . $command);
}
return $this->stripEscapeSequence($stdout);
}
这是两次调用代码的输出:
C:\PHP Projects\Build\vendor\pear\versioncontrol_git\VersionControl\Git\Util\Command.php:240:
string(61) "No errors in "C:\Program Files\Git\bin\git.exe" --version"
C:\PHP Projects\Build\vendor\pear\versioncontrol_git\VersionControl\Git\Util\Command.php:237:
string(306) "Some errors in executing git command . "C:\Program Files\Git\bin\git.exe" clone -q --branch="master" "--REDACTED--" "C:\PHP Projects\Build\build"
Output:
Error:
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.
您的问题不在于 --version,而在于您对 运行 git clone 或 [=24 执行的命令=]git结帐.
您不能使用 运行 git clone 命令或 git checkout 命令git.exe
而当你可以 运行 --version 命令时 git.exe 即 "C:/Program Files/Git/bin/git.exe" --version
所以结论是你必须在运行宁git克隆或git检查时设置命令你的路径应该是
"C:/程序 Files/Git/bin>" git 克隆
要么
"C:/程序 Files/Git/bin>" git 签出
如果您对此仍有疑问,请告诉我。
谢谢。
我正在尝试使用 PHING 检出 git 存储库作为构建过程的一部分。 PHING 使用 pear/versioncontrol_git 来处理 git 任务。我通往 git 的路径是 C:\Program Files\Git\bin\git.exe
.
两个命令 运行 使用此路径,<gitpath> --version
和 <gitpath> clone -q -repo=...
<gitpath> --version
工作正常。 <gitpath> clone...
给出了 C:\Program
不是有效路径的错误。我很困惑为什么当完全相同的代码可以毫无错误地执行 --version
命令时这会成为一个问题。
似乎正在发生的事情是引号被剥离,但只是有时。
这是违规代码:
public function execute($arguments = array(), $options = array())
{
$command = $this->createCommandString($arguments, $options);
$descriptorspec = array(
1 => array('pipe', 'w'),
2 => array('pipe', 'w'),
);
$pipes = array();
$resource = proc_open($command, $descriptorspec, $pipes, realpath($this->git->getDirectory()));
$stdout = stream_get_contents($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
foreach ($pipes as $pipe) {
fclose($pipe);
}
$status = trim(proc_close($resource));
if ($status) {
$message = "Some errors in executing git command . $command\n\n"
. "Output:\n"
. $stdout."\n"
. "Error:\n"
. $stderr;
var_dump($message);
throw new VersionControl_Git_Exception($message);
} else {
var_dump('No errors in ' . $command);
}
return $this->stripEscapeSequence($stdout);
}
这是两次调用代码的输出:
C:\PHP Projects\Build\vendor\pear\versioncontrol_git\VersionControl\Git\Util\Command.php:240:
string(61) "No errors in "C:\Program Files\Git\bin\git.exe" --version"
C:\PHP Projects\Build\vendor\pear\versioncontrol_git\VersionControl\Git\Util\Command.php:237:
string(306) "Some errors in executing git command . "C:\Program Files\Git\bin\git.exe" clone -q --branch="master" "--REDACTED--" "C:\PHP Projects\Build\build"
Output:
Error:
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.
您的问题不在于 --version,而在于您对 运行 git clone 或 [=24 执行的命令=]git结帐.
您不能使用 运行 git clone 命令或 git checkout 命令git.exe
而当你可以 运行 --version 命令时 git.exe 即 "C:/Program Files/Git/bin/git.exe" --version
所以结论是你必须在运行宁git克隆或git检查时设置命令你的路径应该是
"C:/程序 Files/Git/bin>" git 克隆 要么 "C:/程序 Files/Git/bin>" git 签出
如果您对此仍有疑问,请告诉我。
谢谢。