【问题标题】: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='cssrewrite'
    %}
    <link rel="stylesheet" href="{{ asset_url }}" />
    {% endstylesheets %}

Config.yml

assetic:
debug:          %kernel.debug%
use_controller: false
bundles:        [ FooBundle ]
filters:
    cssrewrite: ~

Config_dev.yml

assetic:
use_controller: true

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

所有帮助将不胜感激。

【问题讨论】:

    标签: symfony assetic


    【解决方案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='cssrewrite'
        

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

        php app/console assets:install
        

        Symfony 将创建:

        web/bundles/yourbundle/css/main.css
        

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

        '@FooBundle/Resources/public/css/main.css' filter='cssrewrite'
        

        与:

        'bundles/yourbundle/css/main.css' filter='cssrewrite'
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-23
          • 1970-01-01
          • 1970-01-01
          • 2012-05-18
          • 2014-05-10
          • 1970-01-01
          相关资源
          最近更新 更多