我遇到了非常非常相同的问题。
简而言之:
- 愿意在“内部”目录中拥有原始CSS(资源/资产/css/a.css)
- 愿意在“公共”目录中包含图像(资源/public/images/devil.png)
- 愿意用那个树枝来获取CSS,将其重新编译为web / css / a.css并将其指向/web/bundles/mynicebundle/images/devil.png中的图像
我对以下所有可能的(合理的)组合进行了测试:
- @符号,相对符号
- 没有cssrewrite解析
- CSS图像背景与直接<img>标记src =到与CSS完全相同的图像
- CSS用资产解析,也没有用资产直接输出解析
- 通过尝试
Resources/public/css
使用CSS 的“ public dir”(如)和“ private”目录(如Resources/assets/css
),所有这些都成倍增加。
这使我在同一根树枝上总共获得了14种组合,这条路线从
- “ /app_dev.php/”
- “ /app.php/”
- 和“ /”
因此给出了14 x 3 = 42个测试。
此外,所有这些都已经在子目录中进行了测试,因此,由于绝对无法使用绝对URL,因此无法通过提供绝对URL来欺骗。
测试是两个未命名的图像,然后对于从公用文件夹构建的CSS,将div从'a'命名为'f',对于从内部路径构建的CSS则将其命名为'g至'l'。
我观察到以下几点:
14个测试中只有3个在3个URL上正确显示。NONE来自“内部”文件夹(资源/资产)。拥有备用CSS PUBLIC,然后使用资产FROM进行构建是前提条件。
结果如下:
结果通过/app_dev.php/启动
结果通过/app.php/启动
结果由/发起
所以...仅-第二张图片-Div B-Div C是允许的语法。
这里是TWIG代码:
<html>
<head>
{% stylesheets 'bundles/commondirty/css_original/container.css' filter="cssrewrite" %}
<link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
{% endstylesheets %}
{# First Row: ABCDEF #}
<link href="{{ '../bundles/commondirty/css_original/a.css' }}" rel="stylesheet" type="text/css" />
<link href="{{ asset( 'bundles/commondirty/css_original/b.css' ) }}" rel="stylesheet" type="text/css" />
{% stylesheets 'bundles/commondirty/css_original/c.css' filter="cssrewrite" %}
<link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
{% endstylesheets %}
{% stylesheets 'bundles/commondirty/css_original/d.css' %}
<link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
{% endstylesheets %}
{% stylesheets '@CommonDirtyBundle/Resources/public/css_original/e.css' filter="cssrewrite" %}
<link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
{% endstylesheets %}
{% stylesheets '@CommonDirtyBundle/Resources/public/css_original/f.css' %}
<link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
{% endstylesheets %}
{# First Row: GHIJKL #}
<link href="{{ '../../src/Common/DirtyBundle/Resources/assets/css/g.css' }}" rel="stylesheet" type="text/css" />
<link href="{{ asset( '../src/Common/DirtyBundle/Resources/assets/css/h.css' ) }}" rel="stylesheet" type="text/css" />
{% stylesheets '../src/Common/DirtyBundle/Resources/assets/css/i.css' filter="cssrewrite" %}
<link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
{% endstylesheets %}
{% stylesheets '../src/Common/DirtyBundle/Resources/assets/css/j.css' %}
<link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
{% endstylesheets %}
{% stylesheets '@CommonDirtyBundle/Resources/assets/css/k.css' filter="cssrewrite" %}
<link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
{% endstylesheets %}
{% stylesheets '@CommonDirtyBundle/Resources/assets/css/l.css' %}
<link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
{% endstylesheets %}
</head>
<body>
<div class="container">
<p>
<img alt="Devil" src="../bundles/commondirty/images/devil.png">
<img alt="Devil" src="{{ asset('bundles/commondirty/images/devil.png') }}">
</p>
<p>
<div class="a">
A
</div>
<div class="b">
B
</div>
<div class="c">
C
</div>
<div class="d">
D
</div>
<div class="e">
E
</div>
<div class="f">
F
</div>
</p>
<p>
<div class="g">
G
</div>
<div class="h">
H
</div>
<div class="i">
I
</div>
<div class="j">
J
</div>
<div class="k">
K
</div>
<div class="l">
L
</div>
</p>
</div>
</body>
</html>
container.css:
div.container
{
border: 1px solid red;
padding: 0px;
}
div.container img, div.container div
{
border: 1px solid green;
padding: 5px;
margin: 5px;
width: 64px;
height: 64px;
display: inline-block;
vertical-align: top;
}
还有a.css,b.css,c.css等:都相同,只是更改了颜色和CSS选择器。
.a
{
background: red url('../images/devil.png');
}
“目录”结构为:
目录
所有这一切都是因为我不想让个人原始文件公开,特别是如果我想使用“较少”过滤器或“无礼”或类似的文件...我不希望我的“原创”出版,编译一本。
但是有个好消息。如果您不希望公共目录中有“备用CSS”,请不要使用--symlink
,而是要真正制作一个副本。一旦“ assetic”构建了复合CSS,就可以从文件系统中删除原始CSS,并保留图像:
编译过程
请注意,我这样做是为了 --env=prod
环境。
最后的几点想法:
可以通过将图像放在Git或Mercurial的 “ public”目录中以及将“ assets”目录中的“ css”中来实现此期望的行为。也就是说,与其让安装程序/部署程序(可能是Bash脚本)出现,不如将a,b,c ...置于目录中所示的“ public”中,而是将它们放置在“资产”中而不是“ public”中将CSS暂时放置在assets:install
执行之前的“ public”目录中,然后assets:install
依次执行,然后和,然后在执行assetic:dump
后自动从公共目录中删除CSS assetic:dump
。这将完全达到问题中所需的行为。
另一种(如果可能的话,未知)解决方案是探索“ assets:install”是仅可以将“ public”作为源,还是可以将“ assets”作为要发布的源。如果--symlink
在开发时安装了选件,那将有所帮助。
另外,如果我们要编写脚本来编写从“公共”目录中删除的脚本,那么,将它们存储在单独目录(“资产”)中的需求就消失了。它们可以存在于我们的版本控制系统中的“公共”内部,因为在部署到公共位置时将被删除。这也允许--symlink
使用。
无论如何,现在请当心:由于现在不再有原件了(rm -Rf
),因此只有两种解决方案,而不是三种。工作div“ B”不再工作,因为它是一个asset()调用,假设存在原始资产。仅“ C”(已编译的)将起作用。
所以……只有最后一个获胜者:Div“ C”可以完全满足主题中的要求:要进行编译,请遵循图像的路径,不要将原始信息公开给公众。
赢家是C