我正在使用 AssetMapper 和 ux-twig-component 开发 Symfony 应用程序。 为了优化加载时的资源,我制作了不同的样式表。我的主要样式表是一个
.ccs
模板文件,我在大多数项目中重复使用它。
我的其他文件是我在需要时通过 AssetMapper 包含的
.scss
文件。它们基本上设置了特定 .twig
组件的样式。
我的工作树中的文件夹“assets”的屏幕截图:
{% extends 'base.html.twig' %}
{% block title %}Hello PublicController!{% endblock %}
{% block stylesheets %}
<link rel="stylesheet" href="{{ asset('styles/insets.scss') }}">
{% endblock %}
我的问题是我无法构建我的
.scss
样式表,因为 SassBundle 只需要一个文件“app.scss”。
PS C:\Users\julie\web\web-app-mairie> php bin/console sass:build --watch
[critical] Error thrown while running command "sass:build --watch". Message: "Could not find Sass file: "C:\Users\julie\web\web-app-mairie/assets/styles/app.scss""
In SassBuilder.php line 116:
Could not find Sass file: "C:\Users\julie\web\web-app-mairie/assets/styles/app.scss"
sass:build [-w|--watch]
所以我尝试使用外部二进制文件进行构建。
PS C:\Users\julie\web\web-app-mairie> sass /assets/insets.scss /assets/insets.css
错误 :
Error reading ..\..\..\..\assets\insets.scss: Cannot open file.
我最终尝试将
.scss
文件的路径添加到根配置,就像 Symfony 文档中提到的那样。
但是我在开始时遇到了同样的错误:构建器找不到app.scss
。
这并没有让我感到足够惊讶,因为我必须自己在 config/packages 中创建 symfonycasts_sass.yaml
文件。这是我写的:
# config/packages/symfonycasts_sass.yaml
symfonycasts_sass:
root_sass:
- '%kernel.project_dir%/assets/insets.scss'
我想它使用另一个配置文件......但是在哪里?我在
vendor
目录中搜索了一下,但很快就迷失了方向。
那么各位,你们知道关于这个***的事情吗?或者您有其他解决方案/建议给我吗?
好吧,经过广泛的研究,最后我决定深入我的
vendor
。我在网上找到的都是关于 Webpack Encore 的,我使用 Asset Mapper,并且没有另外安装 webpack(如果它会引起任何冲突,我不知道哈哈)。
嗯,所以...我终于找到了我的敌人文件:
SymfonycastsSassExtension.php
Project
↳ vendor
↳ symfonycasts
↳ sass-bundle
↳ src
↳ DependencyInjection
↳ SymfonycastsSassExtension.php
此
.php
文件负责将 .yaml
配置文件加载为 TreeBuilder
类,并提取参数值作为 ArrayNodeDefinition
,然后,如果未定义,则将默认值应用于此 ArrayNodeDefinition
。
# it's only part of the file
#[...]
public function getConfigTreeBuilder(): TreeBuilder
{
$treeBuilder = new TreeBuilder('symfonycasts_sass');
$rootNode = $treeBuilder->getRootNode();
\assert($rootNode instanceof ArrayNodeDefinition);
$rootNode
->children()
->arrayNode('root_sass')
->info('Path to your Sass root file')
->beforeNormalization()->castToArray()->end()
->cannotBeEmpty()
->scalarPrototype()
->end()
->validate()
->ifTrue(static function (array $paths): bool {
if (1 === \count($paths)) {
return false;
}
$filenames = [];
foreach ($paths as $path) {
$filename = basename($path, '.scss');
$filenames[$filename] = $filename;
}
return \count($filenames) !== \count($paths);
})
->thenInvalid('The "root_sass" paths need to end with unique filenames.')
->end()
->defaultValue(['%kernel.project_dir%/assets/styles/app.scss'])
->end()
#[...]
我用一个愚蠢的名称替换了
->defaultValue(['%kernel.project_dir%/assets/styles/app.scss'])
中的默认值,我不会打扰你。我尝试启动一个构建来测试它是否会因该愚蠢的名称而吐出错误......构建成功了!这次 sass 编译了我之前填写的 .yaml
配置文件。
> php bin/console sass:build --watch
! [NOTE] Downloading Sass binary from https://github.com/sass/dart-sass/releases/download/1.69.7/dart-sass-1.69.7-windows-x64.zip
4002605/4002605 [============================] 100%
! [NOTE] Executing Sass (pass -v to see more details).
[2024-04-11 14:30:51] Compiled assets\styles\insets.scss to var\sass\insets.output.css.
Sass is watching for changes. Press Ctrl-C to stop.
老实说,我有点困惑,我仍然不知道为什么它不早点考虑我的配置文件。代码摘录证明该函数正在寻找,并且我正确命名了我的文件。