How can I force assetic to render assets each time the page is reloaded?

后端 未结 4 511
别跟我提以往
别跟我提以往 2020-12-30 07:23

How can I force assetic to render assets each time the page is reloaded (no matter if assets are modified or not)?

More explanation about my issue:

I\'m curr

相关标签:
4条回答
  • 2020-12-30 07:37

    You should pass to use_controller: false and compile your assets after you finish your modification.

    If you want to compile your assets:

    php app/console assetic:dump
    
    0 讨论(0)
  • 2020-12-30 07:41

    I'm using Assetic's Lessphp filter that caches files too. For myself I've created a class that extends default Assetic's filter and touches every file with current time

    <?php
    
    namespace Xxx\AssetsBundle\Assetic\Filter;
    
    use Assetic\Asset\AssetInterface;
    use Assetic\Filter\LessphpFilter;
    
    class LessphpNonCachedFilter extends LessphpFilter
    {
        public function filterLoad(AssetInterface $asset)
        {
            $root = $asset->getSourceRoot();
            $path = $asset->getSourcePath();
    
            $filename = realpath($root . '/' . $path);
    
            if (file_exists($filename)) {
                touch($filename);
            }
    
            parent::filterLoad($asset);
        }
    }
    

    And you must set "assetic.filter.lessphp.class" in your parameters section (services.yml):

    parameters:
        assetic.filter.lessphp.class: Xxx\AssetsBundle\Assetic\Filter\LessphpNonCachedFilter
    
    0 讨论(0)
  • 2020-12-30 07:54

    AFAIK there's no perfect solution for this yet

    I use:

    php app/console assetic:dump --watch
    

    which will compile your .less files each time it detects a change in any of the .less files referenced on your templates.

    To force a compilation you have to make any change in your "main" file (the file that @imports the others). But, the good news are that is just enough to "touch" the file to do that. So you can just manually touch it every time you need:

    touch ~/web/css/main.less;
    

    Or, what i usually do is to set up a script that touches this "main" file each 60 seconds or so:

    while true; do
        sleep 60
        touch ~/web/css/main.less
    done
    

    This should work on linux and mac.

    Hope it helps. At least temporarily :)

    0 讨论(0)
  • 2020-12-30 07:54

    I've created a simple script to solve this problem. Please try it out and let me know if it helped.

    #!/bin/bash
    
    # assetic-watch: A very simple shell-script to recursively and efficiently
    # watch for asset changes and to trigger automatic recompilation.
    #
    # By Slava Fomin II <s.fomin@betsol.ru>  
    # Feel free to contact me.
    # From Russia with Love.
    # Let's make this World a Better place!
    # --------------------------------------
    
    #===============#
    # CONFIGURATION #
    #===============#
    
    # Path relative to "Symfony/src" directory.
    # File changes under specified directory will trigger recompilation
    # of all assets.
    WATCH_PATH="Name/Bundle/NameBundle/Resources/public/css"
    
    # Environment.
    ENV="dev"
    
    # Additional options for "app/console".
    OPTS=""
    
    # inotifywait events to watch for.
    INW_EVENTS="close_write,moved_to,create"
    
    # Optional inotifywait arguments.
    INW_OPTS=""
    
    # Relative path to the Symfony root directory.
    SYMFONY_PATH="../"
    
    #============#
    # PROCESSING #
    #============#
    
    SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
    CONSOLE_PATH="$SCRIPT_DIR/${SYMFONY_PATH}/app/console"
    SRC_PATH="$SCRIPT_DIR/${SYMFONY_PATH}/src/$WATCH_PATH"
    
    quietly() { "$@" > /dev/null 2>&1; }
    
    while true; do
        quietly inotifywait --recursive -e $INW_EVENTS $INW_OPTS $SRC_PATH
        php $CONSOLE_PATH assetic:dump --env=$ENV $OPTS
    done
    

    I really hope Symfony developers will address this issue in the future versions of the Assetic bundle. I believe it's a serious limitation.

    0 讨论(0)
提交回复
热议问题