How to ignore directories with Composer?

This is not possible in Composer. However, there are some ways to do it:

  • When you run the update or install command with --prefer-dist, Composer tries to download the archive on github. You can remove the test directory from the archives by putting this in a .gitattributes file in the root directory of your project:

    Tests/ export-ignore
    
  • Composer will only use the tags on github. Just temporary remove the tests directory when creating a tag will also do the trick.


It's possible to control the archive creation by adding exclude patterns in the composer.json file within the archive key. See https://getcomposer.org/doc/04-schema.md#archive for details.

The example given (cited from above URL):

{
    "archive": {
        "exclude": ["/foo/bar", "baz", "/*.test", "!/foo/bar/baz"]
    }
}

The example will include /dir/foo/bar/file, /foo/bar/baz, /file.php, /foo/my.test but it will exclude /foo/bar/any, /foo/baz, and /my.test.

That way you have about the same control that .gitattributes would give you, without having to use Git or affecting any processes that require different settings in said file.


This can be automated with post-update-cmd the composer.json file within the scripts key:

"scripts": {
    "post-update-cmd": [
        "rm -rf vendor/aura/intl/tests vendor/cakephp/cakephp/tests"
    ],
},

Or use pattern to remove directories:

"scripts": {
    "post-update-cmd": [
        "find vendor/ -type d -regextype posix-extended -iregex '.*/(doc|docs|example|examples|test|tests|tmp)' -print -exec rm -r {} +"
    ],
},

This has been possible since Nov 11, 2015 with https://getcomposer.org/doc/04-schema.md#exclude-files-from-classmaps

Source: https://github.com/composer/composer/issues/4456#issuecomment-155825777

EDIT: Misinterpretation. The above only lets the autoloader ignore the specified paths, it does not actually prevent them from being copied to the filesystem upon install.

Tags:

Composer Php