资产生成链接但没有文件

Posted

技术标签:

【中文标题】资产生成链接但没有文件【英文标题】:Assetic generating links but no files 【发布时间】:2012-06-07 11:22:10 【问题描述】:

我正在尝试使用 symfony2 中的资产来管理我的 CSS。 链接生成良好。但是,不会生成任何文件。

这是我的配置:

Layout.html.twig

    % stylesheets
      '@FooBundle/Resources/public/css/main.css'
      filter='cs-s-rewrite'
    %
    <link rel="stylesheet" href=" asset_url " />
    % endstylesheets %

Config.yml

assetic:
debug:          %kernel.debug%
use_controller: false
bundles:        [ FooBundle ]
filters:
    cs-s-rewrite: ~

Config_dev.yml

assetic:
use_controller: true

Assetic 生成链接foo.foo/app_dev.php/css/957d3aa_main_1.css。但是,该文件不存在(或其他任何地方)。我尝试过使用权限并查看(nginx)日志,但到目前为止没有。

所有帮助将不胜感激。

【问题讨论】:

【参考方案1】:

在处理资产时,您有 2 个选项。您在计算机中看不到资产的原因是您选择了选项 1。


选项 1:SYMFONY 可以为您动态处理文件

这意味着在开发环境中生成的每个资产路径都由 Symfony 动态处理。因此,Assetic 会生成您计算机上实际不存在的 CSS 和 javascript 文件的路径。这是一个内部 Symfony 控制器,可以打开文件并为您返回内容。

优点: - 对您的资产所做的更改立即生效 - 这在开发模式下非常棒,因为 Symfony 会为您动态生成文件

缺点: - 这在 prod 模式下是不可能的,因为动态渲染每个资产会太慢 - 资产将无法在您的计算机上直接访问(这就是您找不到文件的原因) - 如果您使用大量过滤器等,可能会很慢......

要在开发模式下执行此操作,只需在 config_dev.yml 中编辑资产配置:

assetic:
    use_controller: true

选项 2:转储资产文件

如果您不想动态处理资产,您可以手动转储资产,这意味着实际将资产物理写入您的计算机上。

优点: - Symfony 不需要动态生成文件,因此运行速度会快很多 - 因此,这在 prod 模式下是完美的 - 这些文件可以在 web/ 目录中物理访问(或您选择输出它们的任何位置)

缺点: - 每次更改某些内容时都需要转储资产。或者您可以使用 --watch 命令转储资产,如果您在开发模式下工作,这可能会有点烦人。

为此:

将 use_controller 设置为 false (config_dev.yml):

assetic:
    debug:          %kernel.debug%
    use_controller: false

如有必要,您甚至可以选择读取和输出资产的位置

   assetic:
        read_from:      %kernel.root_dir%/Resources/views/
        write_to:       %kernel.root_dir%/../web/thefolderyouwant/

输出现在从您的 write_to 在assetic 中的配置开始

% stylesheets
  '@FooBundle/Resources/public/css/main.css'
  output='css/main.css'
%
<link rel="stylesheet" href=" asset_url " />
% endstylesheets %

如果你继续,你将有一个resource error,所以注释掉或删除config_dev.yml中的这些资产路由:

_assetic:
    resource: .
    type:     assetic

最后,您可以自动生成资产,以便您所做的更改立即生效:

php app/console assetic:dump --watch

在这种情况下,文件现在应该可用:

/web/thefolderyouwant/css/main.css

有关更多信息,请参阅食谱:How to use Assetic for Asset Management?

【讨论】:

我认为最好编辑您的第一个答案而不是发布新答案。 这行得通!文件现已创建。但是,/app_dev.php/css/2c29233.css 给出了 404;没有 app_dev.php 它不会。我已经尝试了所有可能的 nginx 配置,但无法让它工作:( 会尝试更多。如果我无法弄清楚,我会发布另一个问题并在此处放置链接。无论如何谢谢!( ps 不能再奖励 17 小时的赏金。我会的,不用担心) 我真的很抱歉,但事实证明它不起作用。它仅在首先倾销资产时才有效。它应该没有..这就是重点:S 在配置中设置 use_controller: false 时,您肯定需要转储资产。 Symfony 不再为您生成这些资产。您可以在转储资产时添加 --watch 以自动添加它们。 查看 6 月 7 日 15:51 的评论 -> 即使我将其设置为 true,文件也不会生成..【参考方案2】:

我有同样的问题,我只需要安装java

sudo apt-get install default-jre

您还可以查看输出的开头,这可能会有所帮助:

app/console assetic:dump > outfile 2>&1

【讨论】:

这仅适用于基于 Java 的过滤器(YUI 压缩器)。【参考方案3】:

如果您使用 SASS 编译 SCSS 但 ruby 或 ruby​​ gem sass 未安装,则在打开 use_controller: true 时它也不会生成文件。

【讨论】:

【参考方案4】:

我遇到了一个与此非常相似的错误。突然,资产停止工作。我唯一添加的是FOSRestBundle。也许您也在使用其余捆绑包。

这是我的解决方案:

fos_rest:
    routing_loader:
        default_format: json

    param_fetcher_listener: true
    body_listener: true

    format_listener:
        rules:
            # render "/api" requests as json
            -  path: ^/api, priorities: [ json ], fallback_format: json, prefer_extension: true 
            # default, fallback rendering twig templates
            -  path: ^/, priorities: ['html', 'application/javascript', 'text/css', '*/*'], fallback_format: html, prefer_extension: true 

我将priorities: ['html', '*/*'] 更改为priorities: ['html', 'application/javascript', 'text/css', '*/*'],现在一切正常。

【讨论】:

【参考方案5】:

我终于找到解决办法了!!我在这个问题上工作了几个小时!你写道:

'@FooBundle/Resources/public/css/main.css' filter='cs-s-rewrite'

但是“cs-s-rewrite”过滤器不接受@FooBundle 语法!你必须这样做:

php app/console assets:install

Symfony 将创建:

web/bundles/yourbundle/css/main.css

现在,在您的树枝模板中,替换:

'@FooBundle/Resources/public/css/main.css' filter='cs-s-rewrite'

与:

'bundles/yourbundle/css/main.css' filter='cs-s-rewrite'

希望它能帮助别人! (它是在 Symfony 文档中编写的.. ^^)

【讨论】:

以上是关于资产生成链接但没有文件的主要内容,如果未能解决你的问题,请参考以下文章

Symfony Assetic 没有链接自己的包

将资产链接到 solana 代币

Google Play 应用签名和即时应用

导入 Sceneform 资产不会生成 .sfa 和 .sfb 文件

如何链接 Laravel 模块内部的资产?

为啥生成 pdb 文件会导致静态链接库的大小大幅增加?