Ruby Symfony assetic sass通过节点sass过滤?
我在使用assetic sass过滤器来处理Ruby Symfony assetic sass通过节点sass过滤?,ruby,node.js,symfony,sass,Ruby,Node.js,Symfony,Sass,我在使用assetic sass过滤器来处理节点sass而不是ruby替代方案时遇到了一些困难。我的config.yml文件中有以下配置: assetic: debug: "%kernel.debug%" use_controller: false bundles: [ ] write-to: "%kernel.root_dir%/../web/assets" read_from: "%kernel
节点sass
而不是ruby替代方案时遇到了一些困难。我的config.yml
文件中有以下配置:
assetic:
debug: "%kernel.debug%"
use_controller: false
bundles: [ ]
write-to: "%kernel.root_dir%/../web/assets"
read_from: "%kernel.root_dir%/../web/assets"
node: "%%PROGRAMFILES%%\nodejs\\node.exe"
node_paths: ["%%USERPROFILE%%\\AppData\\Roaming\\npm\\node_modules"]
sass: "%%USERPROFILE%%\\AppData\\Roaming\\npm\\node-sass"
ruby: null
filters:
cssrewrite: ~
scss:
output-style: compressed
apply_to: "\.(scss|sass|css)%"
虽然这会触发右节点sass
命令,但我不确定配置是否正确。如果我删除ruby:null
它会尝试运行C:\ProgramFiles…\path\to\ruby.exe%%USERPROFILE%%\\AppData\\Roaming\\npm\\node sass
,这是完全错误的。但是使用ruby:null
也不能解决问题,因为它设置了错误的参数(即--load path
而不是--include path
),这也会造成混乱
有人知道如何用
节点设置sass
过滤器,而不是ruby
?我想把我对这个问题的解决方案分享给那些可能也遇到过这个问题的人
似乎BaseSassFilter
只适合与ruby版本一起使用。所以我决定创建自己的过滤器。这是我的班级:
<?php
namespace App\YourBundle\Assetic\Filter;
use Assetic\Asset\AssetInterface;
use Assetic\Exception\FilterException;
use Assetic\Filter\Sass\BaseSassFilter;
use Assetic\Filter\Sass\SassFilter;
/**
* This class is based on Assetic\Filter\Sass\SassFilter and is slightly modified to work with node-sass instead of Ruby.
*/
class NodeSassFilter extends BaseSassFilter
{
const STYLE_NESTED = 'nested';
const STYLE_EXPANDED = 'expanded';
const STYLE_COMPACT = 'compact';
const STYLE_COMPRESSED = 'compressed';
private $sassPath;
private $scss;
private $style;
private $quiet;
private $cacheLocation;
public function __construct($sassPath = '/usr/bin/node-sass')
{
$this->sassPath = $sassPath;
$this->cacheLocation = realpath(sys_get_temp_dir());
}
public function setScss($scss)
{
$this->scss = $scss;
}
public function setStyle($style)
{
$this->style = $style;
}
public function setQuiet($quiet)
{
$this->quiet = $quiet;
}
public function filterLoad(AssetInterface $asset)
{
$sassProcessArgs = array($this->sassPath);
$pb = $this->createProcessBuilder($sassProcessArgs);
if ($dir = $asset->getSourceDirectory()) {
$pb->add('--include-path')->add($dir);
}
if ($this->style) {
$pb->add('--output-style')->add($this->style);
}
if ($this->quiet) {
$pb->add('--quiet');
}
// input
$pb->add($input = tempnam(sys_get_temp_dir(), 'assetic_sass'));
file_put_contents($input, $asset->getContent());
$proc = $pb->getProcess();
$code = $proc->run();
unlink($input);
if (0 !== $code) {
throw FilterException::fromProcess($proc)->setInput($asset->getContent());
}
$asset->setContent($proc->getOutput());
}
public function filterDump(AssetInterface $asset)
{
}
}
在app/config/filters/nodesass.xml
中添加以下xml:
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<parameters>
<parameter key="assetic.filter.nodesass.class">App\YourBundle\Assetic\Filter\NodeSassFilter</parameter>
<parameter key="assetic.filter.nodesass.bin">%assetic.sass.bin%</parameter>
<parameter key="assetic.filter.nodesass.timeout">240</parameter>
<parameter key="assetic.filter.nodesass.style">null</parameter>
<parameter key="assetic.filter.nodesass.load_paths" type="collection" />
</parameters>
<services>
<service id="assetic.filter.nodesass" class="%assetic.filter.nodesass.class%">
<tag name="assetic.filter" alias="nodesass" />
<argument>%assetic.filter.nodesass.bin%</argument>
<call method="setTimeout"><argument>%assetic.filter.nodesass.timeout%</argument></call>
<call method="setStyle"><argument>%assetic.filter.nodesass.style%</argument></call>
<call method="setLoadPaths"><argument>%assetic.filter.nodesass.load_paths%</argument></call>
</service>
</services>
</container>
App\YourBundle\Assetic\Filter\NodeSassFilter
%资产增值税
240
无效的
%资产.过滤器.节点资产.仓位%
%assetic.filter.nodesass.timeout%
%assetic.filter.nodesass.style%
%assetic.filter.nodesass.load\u路径%
这应该能让事情暂时运转起来。干得好。这应该放在assetic存储库中,我也主要通过没有ruby的node来管理资产。我会检查他们在最新版本中是否已经解决了这一问题,如果我有时间的话,我会做一个PR。:)好的,谢谢-我花了几个小时来处理加载路径(ruby sass)和加载导入(节点sass)。。。为了最终认识到sass过滤器应该与ruby一起使用:),我制作了一个节点sass filter github.com/kriswallsmith/assetic/pull/767,它的工作原理与您的非常类似。看起来效果不错。希望@gremo的公关很快合并!
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<parameters>
<parameter key="assetic.filter.nodesass.class">App\YourBundle\Assetic\Filter\NodeSassFilter</parameter>
<parameter key="assetic.filter.nodesass.bin">%assetic.sass.bin%</parameter>
<parameter key="assetic.filter.nodesass.timeout">240</parameter>
<parameter key="assetic.filter.nodesass.style">null</parameter>
<parameter key="assetic.filter.nodesass.load_paths" type="collection" />
</parameters>
<services>
<service id="assetic.filter.nodesass" class="%assetic.filter.nodesass.class%">
<tag name="assetic.filter" alias="nodesass" />
<argument>%assetic.filter.nodesass.bin%</argument>
<call method="setTimeout"><argument>%assetic.filter.nodesass.timeout%</argument></call>
<call method="setStyle"><argument>%assetic.filter.nodesass.style%</argument></call>
<call method="setLoadPaths"><argument>%assetic.filter.nodesass.load_paths%</argument></call>
</service>
</services>
</container>