SASS编译器无法从exec运行

时间:2017-12-30 13:47:16

标签: php sass

在CentOS容器中,我试图让SASS从PHP exec()执行。 SASS是可执行的,我可以手动从容器内成功执行命令,但不能从PHP执行。

我正在尝试的命令是:

PHP

$command = '/usr/local/bin/sass ' . $webFolderPath . '/styles/style_303.scss' . ' ' . $webFolderPath . '/styles/style_303.css';
$command .= " 2>&1";
echo $command;
exec($command, $output, $return);

转换为:

/usr/local/bin/sass /var/www/html/portal/web/styles/style_303.scss /var/www/html/portal/web/styles/style_303.css 2>&1

我收到以下错误。

/usr/share/rubygems/rubygems/path_support.rb:68:in `path=': undefined method `+' for nil:NilClass (NoMethodError)
    from /usr/share/rubygems/rubygems/path_support.rb:30:in `initialize'
    from /usr/share/rubygems/rubygems.rb:357:in `new'
    from /usr/share/rubygems/rubygems.rb:357:in `paths'
    from /usr/share/rubygems/rubygems.rb:379:in `path'
    from /usr/share/rubygems/rubygems/specification.rb:794:in `dirs'
    from /usr/share/rubygems/rubygems/specification.rb:658:in `each_normal'
    from /usr/share/rubygems/rubygems/specification.rb:669:in `_all'
    from /usr/share/rubygems/rubygems/specification.rb:822:in `each'
    from /usr/share/rubygems/rubygems/specification.rb:864:in `find'
    from /usr/share/rubygems/rubygems/specification.rb:864:in `find_inactive_by_path'
    from /usr/share/rubygems/rubygems.rb:175:in `try_activate'
    from /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:132:in `rescue in require'
    from /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:144:in `require'
    from <internal:abrt_prelude>:2:in `<compiled>'
  

版本:

     

Sass:3.5.4(出血边缘)

     

Ruby:2.0.0p648(2015-12-16)[x86_64-linux]

     

宝石:2.0.14.1

     

CentOS:7

任何想法,如果我遗失了什么?

2 个答案:

答案 0 :(得分:0)

我之前遇到过类似的问题,当时我试图从PHP脚本中运行grunt。事实证明,问题是缺少环境变量。

因此,如果您可以在bash中执行sass命令,但它不能在php脚本中运行,以下内容可以帮助您解决问题。

要列出当前的环境变量,可以使用unix命令printenv。这应该给你一个如下列表

LANG=en_US.UTF-8
rvm_bin_path=/usr/local/rvm/bin
rvm_version=1.26.11 (latest)
RUBY_VERSION=ruby-2.2.1
GEM_HOME=/usr/local/rvm/gems/ruby-2.2.1
...

由于scss使用ruby,因此必须拥有所有ruby env vars。因此,您可以从printenvs输出中选择所需的所有内容,并将其写入数组中。

$env = [
    "LANG" => "en_US.UTF-8",
    "rvm_bin_path" => "/usr/local/rvm/bin",
    ...
];
$env_command = '';
foreach ($env as $var => $value) {
    $env_command .= "$var=$value ";
}

$command = "/usr/local/bin/sass ...";

exec "$env_command $command";

我不确定哪些变量非常重要 - 所以你必须自己解决这个问题。

答案 1 :(得分:0)

好的,我设法解决了问题。 sass要求主目录正常运行。如果您正在以系统用户身份执行PHP,在我的情况下,它没有主目录,这就是失败的原因。

在Linux上,您可以使用mkhomedir_helper [user]创建主目录。创建主目录后,sass将开始工作。