Giter Club home page Giter Club logo

composer-vendor-cleaner's Introduction

Composer Vendor Cleaner Packagist

This composer plugin removes unnecessary development files and directories from vendor directory.

Installation

Local installation to project:

composer require liborm85/composer-vendor-cleaner

Global installation:

composer global require liborm85/composer-vendor-cleaner

Requirements

  • PHP 5.6.0+

Configuration

Development files and directories to remove can be defined in composer.json file in extra data attribute per new key dev-files. Glob pattern syntax is fully supported.

Example:

"extra": {
    "dev-files": {
        "/": [                  // means: find in all library packages directories and bin directory
            "tests/",           // means: tests directory whatever
            "docs/",
            ".travis.yml"       // means: .travis.yml file whatever
        ],
        "*/*": [                // means: find in all library packages directories, but NOT in bin directory
            "*.sh"
        ],
        "bin": [                // means: find in composer bin directory
            "*.bat"
        ],
        "twig/twig": [          // means: find only in twig/twig package directory
            "doc/",
            "/drupal_test.sh"   // means: only file in root directory of twig/twig package
        ],
        "symfony/*": [          // means: find in all symfony packages
            "Tests/"
        ],
        "other/package": [
            "/src/**/*.md"      // means: find whatever all md files in src directory, eg.: /src/dir1/test.md, /src/dir1/dir2/readme.md
        ],
        "example/package": [    // means: remove all files and directories in language directory without cs.php file
            "languages/*",
            "!languages/cs.php" // means: exclude cs.php file from remove
        ]
    }
}

Development files and directories can also be defined in an external json file, by specifying the relative path to this file in the dev-files key in the root composer.json. The format is the same as above.

"extra": {
    "dev-files": "composer.dev-files.json"
}

Example of composer.dev-files.json file:

{
  "/": [
    ".github/"
  ],
  "twig/twig": [
    "doc/"
  ]
}

For additional configuration can be used config attribute.

  • match-case (default: true) - Match case of name files and directories.
  • remove-empty-dirs (default: true) - Removes empty directories.
  • no-dev-only (default: false) - If is set true start the cleanup only if the composer command is run with --no-dev.

Example:

"config": {
    "dev-files": {
        "match-case": false,
        "remove-empty-dirs": false
    }
}

Why a new plugin?

Some composer packages contain files and directories that do not belong to production servers, but composer does not solve this.

Exists a lot of plugins for composer trying to solve this issue, they don't have advanced patterns to filtering or they are not user definable. Or some have no configuration and it works automatically and delete almost everything and then the package does not work.

That's why I created a new one that allows advanced filtering by glob patterns.

If you miss a feature or find bug, please, create an issue.

License

MIT

composer-vendor-cleaner's People

Contributors

ceesgeene avatar fbrinker avatar liborm85 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

composer-vendor-cleaner's Issues

[Feature request] Only clean on --no-dev install

Hi,

I'd like to suggest an extension of the plugin. Currently the plugin is executed after every package installation. But when I'm developing, I might want to look at a package's tests for reference. So I'd suggest the following:

  1. Add a boolean flag to the plugin config in composer.json, something like "skip-during-dev" or "no-dev-only"
  2. If that flag is present and set to true, start the cleanup task only if the composer command is run with --no-dev

Empty (Null) Path RuntimeException

Problem

When using this plugin with the package "roave/security-advisories", I get the following error, due to the fact that getInstallPath() returns null:

In Directory.php line 58:
[RuntimeException]
Directory name must not be empty.

With another composer version:

Deprecation Notice: RecursiveDirectoryIterator::__construct(): Passing null to parameter #1 ($directory) of type string is deprecated in /app/vendor/liborm85/composer-vendor-cleaner/src/Directory.php:58

In Directory.php line 58:
[ValueError]
RecursiveDirectoryIterator::__construct(): Argument 1 ($directory) cannot be empty

Reproduction

Composer file to reproduce this:

{
    "name": "test/cleanup",
    "description": "cleanup test",
    "config": {
        "platform": {
            "php": "8.1.0"
        },
        "allow-plugins": {
            "liborm85/composer-vendor-cleaner": true
        }
    },
    "extra": {
        "dev-files": {
            "ramsey/uuid": [
                "*.md"
            ]
        }
    },
    "require": {
        "php": "8.1.*",
        "ramsey/uuid": "4.2.3",
        "liborm85/composer-vendor-cleaner": "1.7.0"
    },
    "require-dev": {
        "roave/security-advisories": "dev-latest"
    }
}

... by running docker run --rm --interactive --tty --volume $PWD:/app composer update

Solution

To avoid the error and the deprecation, I would like to introduce a null check additionally to the empty string check.

"dev-files": "composer.dev-files.json" and options

I want to use external files for the lists but also set the match-case or remote-empty-dirs options.

How do i mix "dev-files": "composer.dev-files.json" and "config": { "dev-files": { "match-case": false, "remove-empty-dirs": false } }

“[RuntimeException] Directory name must not be empty.“ while iterating directories

Hi!

I'm testing out your plugin to clean up the vendor directory of a Drupal 8 installation, but when the plugin is enabled I encounter an exception.

I have required the plugin and configured it thus to try it out:

"dev-files": { "vendor/": [ "tests/", "docs/", ".travis.yml", "doc/" ] }

Now when I no-dev-install my dependencies, eventually I get:

[RuntimeException] Directory name must not be empty.

With the following exception trace:

Exception trace:
 () at /Users/marc/workspace/drupal8.marcmachttheater.de/vendor/liborm85/composer-vendor-cleaner/src/Directory.php:57
 RecursiveDirectoryIterator->__construct() at /Users/marc/workspace/drupal8.marcmachttheater.de/vendor/liborm85/composer-vendor-cleaner/src/Directory.php:57
 Liborm85\ComposerVendorCleaner\Directory->getDirectories() at /Users/marc/workspace/drupal8.marcmachttheater.de/vendor/liborm85/composer-vendor-cleaner/src/Cleaner.php:150
 Liborm85\ComposerVendorCleaner\Cleaner->removeEmptyDirectories() at /Users/marc/workspace/drupal8.marcmachttheater.de/vendor/liborm85/composer-vendor-cleaner/src/Cleaner.php:97
 Liborm85\ComposerVendorCleaner\Cleaner->cleanupPackages() at /Users/marc/workspace/drupal8.marcmachttheater.de/vendor/liborm85/composer-vendor-cleaner/src/Plugin.php:147
 Liborm85\ComposerVendorCleaner\Plugin->cleanup() at n/a:n/a
 call_user_func() at phar:///usr/local/bin/composer/src/Composer/EventDispatcher/EventDispatcher.php:164
 Composer\EventDispatcher\EventDispatcher->doDispatch() at phar:///usr/local/bin/composer/src/Composer/EventDispatcher/EventDispatcher.php:96
 Composer\EventDispatcher\EventDispatcher->dispatchScript() at phar:///usr/local/bin/composer/src/Composer/Autoload/AutoloadGenerator.php:112
 Composer\Autoload\AutoloadGenerator->dump() at phar:///usr/local/bin/composer/src/Composer/Installer.php:307
 Composer\Installer->run() at phar:///usr/local/bin/composer/src/Composer/Command/InstallCommand.php:122
 Composer\Command\InstallCommand->execute() at phar:///usr/local/bin/composer/vendor/symfony/console/Command/Command.php:245
 Symfony\Component\Console\Command\Command->run() at phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:835
 Symfony\Component\Console\Application->doRunCommand() at phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:185
 Symfony\Component\Console\Application->doRun() at phar:///usr/local/bin/composer/src/Composer/Console/Application.php:281
 Composer\Console\Application->doRun() at phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:117
 Symfony\Component\Console\Application->run() at phar:///usr/local/bin/composer/src/Composer/Console/Application.php:113
 Composer\Console\Application->run() at phar:///usr/local/bin/composer/bin/composer:61
 require() at /usr/local/bin/composer:24

Not sure, what the right approach would be here. Have the directory iterator skip empty paths would be the most obvious solution, but that's just working around the symptom, not really addressing the cause…?

How to switch back to the dev-dependencies in your dev-workflow?

Hi,

currently it seems, that I must always execute a "composer update" command for getting back to my dev-dependencies. Let's say you are in the dev-phase. How do you get your dev-dependencies? It get get quite annoying, if you must always update all of your dependencies. Because you can stumble into issues with new versions quite often.

It should not be necessary to run a "composer update" command to get back to your dev dependencies. Do you recommend to work with an additional composer.lock file?

Run after deploy

Hi, is there a way to run the plugin after deploy and not before?

Folders are removed, files are not

Hi,

first of all: thanks for sharing your composer package!

I see that folders are removed correctly. Also folders can be excluded. But file paths are not handled, yet.

See the dev-files section from my composer.json file:

        "dev-files": {
            "/": [
                "twig/twig/src/test/integrationtestcase.php",
                "composer/semver/src/versionparser.php",
                "consolidation/output-formatters/src/formatters/stringformatter.php",
                "consolidation/output-formatters/src/transformations/tabletransformation.php",
                "consolidation/output-formatters/src/transformations/wrap/columnwidths.php",
                "symfony/filesystem/tests/",
                "symfony/http-client-contracts/test/",
                "twig/twig/src/test/integrationtestcase.php",
                "demos/",
                "demo/",
                "tests/",
                "testing/",
                "testing/",
                "consolidation/",
                "doctrine/cache/",
                "drupal/coder/",
                "drush/drush/",
                "examples/",
                "!/modules/lightning_core/",
                "composer/semver/src/versionparser.php",
                "consolidation/output-formatters/src/formatters/stringformatter.php",
                "consolidation/output-formatters/src/transformations/tabletransformation.php",
                "consolidation/output-formatters/src/transformations/wrap/columnwidths.php",
                "symfony/filesystem/tests/filesystemtest.php",
                "symfony/filesystem/tests/filesystemtestcase.php",
                "symfony/filesystem/tests/lockhandlertest.php",
                "symfony/http-client-contracts/test/fixtures/web/index.php"
            ]
        },
        "config": {
          "bin-dir": "bin/",
          "sort-packages": true,
          "dev-files": {
            "no-dev-only": true
          }
      },

None of the specified file paths like

symfony/http-client-contracts/test/fixtures/web/index.php

do remove any files.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.