Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to pass arguments to custom composer script

In my Laravel project, I want to run phpunit for a single file, like this one:

$ composer run-script test tests/Unit/Services/OrderServiceTest.php

Here is my composer setup:

"scripts": {
    "test": [
        "@testenv",
        "@phpunit"
    ],
    "testenv": [
        "php artisan config:cache --env=testing",
        "php artisan config:clear"
    ],
    "phpunit": [
        "php ./vendor/phpunit/phpunit/phpunit --"
    ]
}

However, I'm running into this error:

www@287dd7480e22:/var/www$ composer run-script test tests/Unit/Services/OrderServiceTest.php

php artisan config:cache --env=testing 'tests/Unit/Services/OrderServiceTest.php'

Too many arguments, expected arguments "command".

Notice:

  • I've seen this post: How do you pass an argument to a composer script from the command line?. But either the solution (adding -- at the end of custom composer script) does not work for my case or I do not understand it properly.
  • If I do not pass an argument, the script runs without a problem. (i.e. run phpunit for all test files)
like image 569
glinda93 Avatar asked Sep 13 '25 18:09

glinda93


1 Answers

There is a trick that allows you to ignore an argument for a sub-script:

"scripts": {
    "testenv": [
        "php artisan config:cache --env=testing || exit $?",
        ...
    ],
    ...
}

What happens here is that your argument (let's say OrderServiceTest.php) is appended to the whole command line, but the shell command exit ignores any further arguments after the exit code. And for the exit code we set $? which is the exit code of the last running command in order to not change the overall outcome.

like image 174
Jonas Eberle Avatar answered Sep 16 '25 08:09

Jonas Eberle