15

I followed the guide on the very bottom of this article: http://symfony.com/doc/current/cookbook/assetic/asset_management.html

I have this code:

    {% javascripts
        ...

        output='js/dist/dist.js'
    %}
    <script src="{{ asset_url }}"></script>
    {% endjavascripts %}

Now if I run sf assetic:dump --env=prod it creates the compiled file properly. However, I would like to have it generating a random name (or timestamped) so that the client-side browser cache problem is avoided. Right now it always creates dist.js file which gets cached and when I update my code the users won't see the difference (or get errors).

Is there a way to make it like dist12345678.js?

j0k
  • 22,600
  • 28
  • 79
  • 90
Tower
  • 98,741
  • 129
  • 357
  • 507

3 Answers3

8

You have two options here: Either leave out the output file name (it will then be an autogenerated hash that changes) or use asset versions, as described in the Symfony docs: http://symfony.com/doc/current/reference/configuration/framework.html#ref-framework-assets-version

chiborg
  • 26,978
  • 14
  • 97
  • 115
  • It does not seem to have any effect. I have cleared the cache and ran `assetic:dump --env=prod` and tried against the prod environment and I do not see any `?v0.0.1` there. – Tower Jan 19 '12 at 09:33
  • 6
    Leave out the output file name doesn't work, always generated the same name like "8662e4b.js". Asset version is work good. – alexfv Jan 20 '12 at 12:04
  • Ruuning `php app/console cache:clear --env=prod` before dumping the assets, as @faost mentionned, works – Laurent W. Dec 11 '15 at 12:22
3

I have been doing a lot of experimenting with Assetic for a project, and I stumbled across a way to do exactly what you're asking. If the "output" string contains "*", a derministically generated arbitrary string is substituted for it.

For example, I have the following in a template (PHP, we aren't using twig):

<?php foreach($view['assetic']->javascripts(array('@MyBundle/Resources/public/js/page.js'), array(), array('output' => 'js/compiled/page_*.js')) as $url): ?>
  <script type="text/javascript" src="<?php echo $view->escape($url) ?>"></script>
<?php endforeach; ?>

<?php foreach($view['assetic']->stylesheets(array('@MyBundle/Resources/public/css/page.css'), array(), array('output' => 'css/compiled/page_*.css')) as $url): ?>
  <link rel="stylesheet" href="<?php echo $view->escape($url) ?>" />
<?php endforeach; ?>

When I run app/console assetic:dump, it generates /web/css/compiled/page_8e8fcb3.css and /web/js/compiled/page_241b4e5.js.

AmericanUmlaut
  • 2,817
  • 2
  • 17
  • 27
  • I tried placing an asterisk, but it seems as it gets removed and not replace by a random string. Is this part of Assetic or did you do something on your own? – Tower Apr 04 '12 at 08:38
  • I haven't done anything on my own, and my code is exactly as shown above except for the name of my bundle. Is it possible that something is being lost in compiling your twig template to php? I can't imagine why that would be the case, but nothing else occurs to me that would explain why the asterisk is being treated differently in my system than in yours. – AmericanUmlaut Apr 04 '12 at 10:29
  • Might be a different version. What's yours Assetic version? – Tower Apr 04 '12 at 12:31
  • Sorry for the late reply - I've got Assetic v1.0.3, and AsseticBundle v1.0.1. – AmericanUmlaut Apr 10 '12 at 11:44
  • 5
    An `*` (asterisk) in an asset output filename is substituted by a **non-random** string (and should not be used for cache-busting). See `Assetic\Factory\AssetFactory::generateAssetName()`. It is deterministic, based on the included static files, filters, and options (such as the specified filename for the generated file). @AmericanUmlaut, you should update your answer. – Adam Monsen Nov 16 '12 at 23:52
  • Adam, thank you for your feedback. You're right, I was misusing the word "random", and I've updated my answer to be more precise. – AmericanUmlaut Nov 28 '12 at 08:49
  • Right on. See also: https://groups.google.com/d/topic/symfony-devs/gjDxXa4I1dI/discussion – Adam Monsen Nov 28 '12 at 16:01
1

Better approach is https://github.com/symfony/AsseticBundle/pull/119#issuecomment-28877145

You'll get :

app/console assetic:dump --env=prod --no-debug
Dumping all prod assets.
Debug mode is off.

[file+] /web/assets/static-fe1927d.css
[file+] /web/assets/static-6e92057.js