symfony: Did you forget to run "composer require symfony/asset"? Unknown function "asset".

Symfony version(s) affected: 5.3.0

Description This is a very hard issue to describe so I will just try to tell what I have found myself. I started getting this exception in my Behat tests running on GitHub Actions: Did you forget to run "composer require symfony/asset"? Unknown function "asset". and that started me down a path of trying to reproduce it on my local machine. But I have given up on that. The last thing I did was to output composer show on both my local machine and GitHub Actions and they were an exact match. None the less I only get the exception when running my GitHub Actions workflow. I have added the workflow below in additional context.

What I figured out is that the workflow succeeds if I add this to my composer.json:

"symfony/framework-bundle": "~5.2.0",
"symfony/asset": "~5.2.0",
"symfony/twig-bridge": "~5.2.0",
"symfony/twig-bundle": "~5.2.0"

From the log on GitHub Actions that the version installed of these packages is 5.2.10 so I started comparing 5.3.0 with 5.2.10 for these packages and I can see that something changes with regards to assets, but I am not enough into these components to actually pinpoint the place where it goes wrong.

Additional context This is the workflow for the job that fails:

integration-tests:
    name: "Integration tests"

    runs-on: "ubuntu-latest"

    strategy:
        matrix:
            php-version:
                - "7.4"

            dependencies:
                - "highest"

    steps:
        -   name: "Start MySQL"
            run: "sudo /etc/init.d/mysql start"

        -   name: "Checkout"
            uses: "actions/checkout@v2"

        -   name: "Setup PHP, with composer and extensions"
            uses: "shivammathur/setup-php@v2"
            with:
                php-version: "${{ matrix.php-version }}"
                extensions: "${{ env.PHP_EXTENSIONS }}"
                coverage: "none"
                tools: "symfony"
                
        -   name: "Setup node"
            uses: "actions/setup-node@v2"
            with:
                node-version: "10.x"

        -   name: "Install composer dependencies"
            uses: "ramsey/composer-install@v1"
            with:
                dependency-versions: "${{ matrix.dependencies }}"

        -   name: "Lint container"
            run: "(cd tests/Application && bin/console lint:container) || true"

        -   name: "Create database"
            run: "(cd tests/Application && bin/console doctrine:database:create -vvv)"

        -   name: "Create database schema"
            run: "(cd tests/Application && bin/console doctrine:schema:create -vvv)"

        -   name: "Validate Doctrine mapping"
            run: "(cd tests/Application && bin/console doctrine:schema:validate -vvv)"
            
        -   name: "Get Yarn cache directory"
            id: "yarn-cache"
            run: "echo \"::set-output name=dir::$(yarn cache dir)\""

        -   name: "Cache Yarn"
            uses: "actions/cache@v2"
            with:
                path: "${{ steps.yarn-cache.outputs.dir }}"
                key: "yarn-${{ hashFiles('**/package.json **/yarn.lock') }}"
                restore-keys: "yarn-"
        
        -   name: "Install JS dependencies"
            run: "(cd tests/Application && yarn install)"
            
        -   name: "Install assets"
            run: "(cd tests/Application && bin/console assets:install public -vvv)"
                    
        -   name: "Build assets"
            run: "(cd tests/Application && yarn build)"

        -   name: "Output PHP version for Symfony CLI"
            run: "php -v | head -n 1 | awk '{ print $2 }' > .php-version"
            
        -   name: "Install certificates"
            run: "symfony server:ca:install"
            
        -   name: "Run Chrome Headless"
            run: "google-chrome-stable --enable-automation --disable-background-networking --no-default-browser-check --no-first-run --disable-popup-blocking --disable-default-apps --allow-insecure-localhost --disable-translate --disable-extensions --no-sandbox --enable-features=Metal --headless --remote-debugging-port=9222 --window-size=2880,1800 --proxy-server='direct://' --proxy-bypass-list='*' http://127.0.0.1 > /dev/null 2>&1 &"
            
        -   name: "Wait for Chrome to start"
            run: |
                until curl -s http://127.0.0.1:9222/json/version | grep "Browser" > /dev/null 2>&1
                do
                    sleep 1
                done

        -   name: "Run webserver"
            run: "(cd tests/Application && symfony server:start --port=8080 --dir=public --daemon)"
            
        -   name: "Wait for webserver to start"
            run: |
                until symfony server:list | grep /public > /dev/null 2>&1
                do
                    sleep 1
                done

        -   name: "Run behat"
            run: "vendor/bin/behat --colors --strict -vvv --no-interaction || vendor/bin/behat --colors --strict -vvv --no-interaction --rerun"

        -   name: "Upload Behat logs"
            uses: "actions/upload-artifact@v2"
            if: "failure()"
            with:
                name: "Behat logs"
                path: "etc/build/"
                if-no-files-found: "ignore"

About this issue

  • Original URL
  • State: closed
  • Created 3 years ago
  • Reactions: 1
  • Comments: 15 (14 by maintainers)

Commits related to this issue

Most upvoted comments

@loevgaard If I understood well, you can’t reproduce the bug on local. Try to composer selfupdate on local and then run behat. If it works then I know what happened.

Adding the following configuration:

framework:
    assets: true

Leads to another error:

  [Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException]  
  You have requested a non-existent service "twig.extension.assets". 

Which makes perfect sense because of this line: https://github.com/symfony/symfony/pull/40140/files#diff-58ffcc8e7b802dfed5fa16ed9e11a2d775ff8136b1dd2f66b84273417ad8cb2aR31

@loevgaard

I don’t know the specific behavior behind whether the function asset is available or not. But I know this is related to https://github.com/symfony/symfony/pull/40140. This PR uses a method called ContainerBuilder::willBeAvailable() to activate or deactivate features (surely symfony/asset is impacted). The issue with this PR is this method uses a new behavior of a method in composer/composer (https://github.com/composer/composer/pull/9682) which is only available since 2.1.0.

So if in your CI, the machine always gets the latest version of composer, then there will be differences between the behaviors due to composer versions < 2.1.0 on local and >= 2.1.0 in CI.