在Symfony2中配置Assetic的输出目录

14

我想要全局配置Assetic导出JS文件的目录。目前,它们总是被导出到web/js/*。我想将其更改为web/js/compiled/*

可以在单个文件级别上指定这一点:http://symfony.com/doc/2.0/cookbook/assetic/asset_management.html#dumping-asset-files

我似乎找不到一种方法来在我的Symfony应用程序中全局设置此项配置参数。我漏掉了哪些配置参数吗?

更新

发现一个名为write_to的Assetic配置参数。在config.yml中设置此参数会导致命令行assetic:dump将文件导出到新目录,但在Twig文件中,asset_url变量仍然指向原始路径。


你有没有想出解决方案?我本来以为配置文件中的“read_from”选项就是我们要找的。但是,无论我将read_from参数设置为什么,我的应用程序都使用默认路径。 - kmfk
@kmfk 目前还没有。现在,我们只是为每个“javascripts”块设置“output”参数,但这并不理想。 - anushr
是的,我已经使用Assetic将我的资源直接转储到我们的S3存储桶中,并且我希望生产环境从那里读取文件 - 而开发环境则会转储到本地文件夹中,同样,我的模板应该从该文件夹中读取,而在我们的开发服务器上。最终,我在控制器中检查了环境并传递了一个变量给模板,以为CDN前缀添加asset_url。虽然不是理想的解决方案,但它能够完成工作。 - kmfk
那么为什么存在这个“write_to”参数,当变量{{ asset_url }}并不需要它。这根本没有经过深思熟虑... :( - bekay
5个回答

17
您应该使用属性write_to
例如,在我的配置中,我使用:
# Assetic Configuration
assetic:
    debug:          %kernel.debug%
    use_controller: %kernel.debug%
    read_from:      %kernel.root_dir%/Resources/views/
    write_to:       %kernel.root_dir%/../web/static/

你的输出字符串从write_to结束的地方开始。

例如:

{% javascripts filter="closure" output='js/main.js'

...

 {% stylesheets filter='compass,?cssrewrite' 
     'default/static/sass/screen.scss' 
     output='css/screen.css' 
 %} 

两者将分别放置在/web/static/js/main.js/web/static/css/screen.css中。

assets_base_urls用于指定从http和ssl(https)页面引用的资产所使用的基本URL。

!! assets_base_urls也被{% images %}用作output值之前的根,但{% images %}在渲染html时不考虑write_to(仅在转储时考虑),因此最好不要使用write_to,只依赖于output值。更多信息请参见我在stackoverflow上的另一篇文章这篇关于AsseticBundle的github文章


4

您可以将twig的资源路径(assets_base_urls)设置为静态路径,而不是使用相对路径。在config.yml文件中,它看起来类似于:

framework:
   templating:
      engines: ['twig']
         assets_base_urls:
            http: [http://path.to-cdn.com]

这会影响 assetic 的 asset_url 和 twig 的 asset() 方法。后者可能是有意为之的,也可能不是。

2
仅做简要说明。如果您使用assets_base_urls 指定相对基本URL,则此功能仅适用于Symfony 2.7之前的版本,因为在该版本中引入了新的资产组件。有关如何更改此设置的更多信息,请参见http://symfony.com/blog/new-in-symfony-2-7-the-new-asset-component,但长话短说:
framework:
    templating:
        assets_base_urls: 
            http: ['/some-relative-url']
            ssl: ['/some-relative-url']

变成:

framework:
    assets:
        base_path: /some-relative-url

2

这篇 GitHub 问题评论 帮助了我解决这个问题。 在开发环境中,你的资源仍将通过控制器处理,但在生产环境中,URL 将按您所需的方式生成。

配置文件 config.yml 示例:

assetic:
    write-to:  %kernel.root_dir%/../web/assets
    ...
framework:
    ...
    templating:
        engines: ['twig']
        packages:
            assetic:
                base_urls: '/assets'

在您的模板中的示例:

{% block javascripts %}
    {% javascripts '@jquery' '@bootstrap_js' '@backbone' '@handlebars' combine=true package='assetic' %}
    <script src="{{ asset_url }}"></script>
    {% endjavascripts %}
{% endblock %}

请注意,在JavaScript标记中添加package='assetic'属性。我认为这是一个很好的折衷方案,因为它不会像kmfk的解决方案那样破坏其他包的资产。

-4

尝试这个命令 $ app/console --env=prod assetic:dump web/,你只需要更改你想要的URL而不是'web/'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接