Пустые проекты Laravel .. так много файлов!Можно ли это как-то уменьшить? - PullRequest
1 голос
/ 31 мая 2019

В прошлый раз, когда я использовал Laravel, было очень давно, и я решил вернуться к нему.

Теперь, исходя из CodeIgniter, который в свое время был мощным фреймворком, я был рад загрузить проекты на веб-сайты, так как «системная» папка, содержащая файлы фреймворка, содержала только 121 файл.

Однако проблема с решениями на основе композиторов заключается в том, что крошечный проект может стать огромным, намного большим, чем очень крупномасштабный проект CodeIgniter в те времена. Все зависимости имеют тестовые папки, документацию и тонны модулей, когда иногда используется только один метод.

Я задохнулся при создании пустого проекта Laravel, используя инструкции из официальной документации и увидев папку "vendor", содержащую более 8000 файлов !! (Не считая папок) А он пока ничего не делает .. То есть когда кстати кстати используется флаг --prefer-dist. И я знаю об аргументе --no-dev, который все еще содержит более 5000 файлов. Я хотел сказать, что все эти файлы не используются, особенно при использовании канала распространения.

Так что мой вопрос заключается в том, есть ли способ иметь более избирательный пустой проект Laravel, поскольку на серверах часто есть ограниченные Inode и 8000 файлов + папок для каждого проекта, что позволяет вам достичь предела очень быстро (и загрузка может длиться вечно, если вы можете установить композер на ваш сервер).

Ответы [ 2 ]

2 голосов
/ 31 мая 2019

Composer может удалять посторонние файлы.

В composer.json вашего проекта укажите файлы, которые вам не нужны, с помощью archive и / или exclude-files-from-classmaps значений конфигурации, затем используйте команду archive составителя для создания zip.Загрузите zip и разверните его на сервере или разверните локально и передайте теперь меньший пакет.

$ cat composer.json
...
{
    "archive": {
        "exclude": ["!vendor", "/test/*", "/*.jpg" ]
    }
}
$ php composer.phar archive --format=zip --file=<filename-without-extension>

Эти файлы, совпадающие с archive, вообще не будут присутствовать в вашем zip.Эти файлы, соответствующие exclude-files-from-classmaps, будут присутствовать в файловой системе, но невидимы для автозагрузчика.

0 голосов
/ 31 мая 2019

У меня была такая же ситуация до нескольких дней, поэтому я создал консольную команду для удаления неиспользуемых файлов в vendor Каталог

Шаг: 1

php artisan make:command CleanVendorFolderCommand

Шаг: 2

Скопируйте текущий код и вставьте int в класс команд

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use RecursiveIteratorIterator;
use RecursiveDirectoryIterator;
use FilesystemIterator;

class CleanVendorFolderCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'clean:vendor {--o : Verbose Output} {--dry : Runs in dry mode without deleting files.}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Cleans up useless files from  vendor folder.';

    protected $patterns = 
            [
                'test',
                'tests',
                '.github',
                'README',
                'CHANGELOG',
                'FAQ',
                'CONTRIBUTING',
                'HISTORY',
                'UPGRADING',
                'UPGRADE',
                'demo',
                'example',
                'examples',
                '.doc',
                'readme',
                'changelog',
                'composer',
                '.git',
                '.gitignore',
                '*.md',
                '.*.yml',
                '*.yml',
                '*.txt',
                '*.dist',
                'LICENSE',
                'AUTHORS',
                '.eslintrc',
                'ChangeLog',
                '.gitignore',
                '.editorconfig',
                '*.xml',                
                '.npmignore',
                '.jshintrc',
                'Makefile',
                '.keep',

            ];
    /**
     * List of File and Folders Patters Going To Be Excluded
     *
     * @return void
     */
    protected $excluded = 
            [
                /**List of  Folders*/
                'src',
                /**List of  Files*/
                '*.php',
                '*.stub',
                '*.js',
                '*.json',
            ];
    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct() 
    {
        parent::__construct();
    }
    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle() 
    {
        $patterns = array_diff($this->patterns, $this->excluded);

        $directories = $this->expandTree(base_path('vendor'));

        $isDry = $this->option('dry');

        foreach ($directories as $directory) 
        {
            foreach ($patterns as $pattern) 
            {
                $casePattern = preg_replace_callback('/([a-z])/i', [$this, 'prepareWord'], $pattern);
                $files = glob($directory . '/' . $casePattern, GLOB_BRACE);
                if (!$files) 
                {
                    continue;
                }

                $files = array_diff($files, $this->excluded);
                foreach ($this->excluded as $excluded) 
                {
                    $key = $this->arrayFind($excluded, $files);

                    if ($key !== false) 
                    {
                        $this->warn('SKIPPED: ' . $files[$key]);
                        unset($files[$key]);
                    }
                }
                foreach ($files as $file) 
                {
                    if (is_dir($file)) 
                    {
                        $this->warn('DELETING DIR: ' . $file);
                        if (!$isDry) 
                        {
                            $this->delTree($file);
                        }
                    } else 
                    {
                        $this->warn('DELETING FILE: ' . $file);
                        if (!$isDry) 
                        {
                            @unlink($file);
                        }
                    }
                }
            }
        }
        $this->warn('Folder Cleanup Done!');
    }
    /**
     * Recursively traverses the directory tree
     *
     * @param  string $dir
     * @return array
     */
    protected function expandTree($dir) 
    {
        $directories = [];
        $files = array_diff(scandir($dir), ['.', '..']);
        foreach ($files as $file) 
        {
            $directory = $dir . '/' . $file;
            if (is_dir($directory)) 
            {
                $directories[] = $directory;
                $directories = array_merge($directories, $this->expandTree($directory));
            }
        }
        return $directories;
    }
    /**
     * Recursively deletes the directory
     *
     * @param  string $dir
     * @return bool
     */
    protected function delTree($dir) {
        if (!file_exists($dir) || !is_dir($dir)) 
        {
            return false;
        }

        $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST);
        foreach ($iterator as $filename => $fileInfo) 
        {
            if ($fileInfo->isDir()) 
            {
                @rmdir($filename);
            } else {
                @unlink($filename);
            }
        }
        @rmdir($dir);
    }
    /**
     * Prepare word
     *
     * @param  string $matches
     * @return string
     */
    protected function prepareWord($matches) 
    {
        return '[' . strtolower($matches[1]) . strtoupper($matches[1]) . ']';
    }
    protected function arrayFind($needle, array $haystack) 
    {
        foreach ($haystack as $key => $value) 
        {
            if (false !== stripos($value, $needle)) 
            {
                return $key;
            }
        }
        return false;
    }
    protected function out($message) 
    {
        if ($this->option('o') || $this->option('dry')) 
        {
            echo $message . PHP_EOL;
        }
    }
}

ИСПЫТАНО НА

OS Name Microsoft Windows 10 Pro

Version 10.0.16299 Сборка 16299

Processor Процессор Intel (R) Core (TM) i3-7100U @ 2,40 ГГц, 2400МГц, 2 ядра (я), 4 логических процессора (ов)

СЕЙЧАС ТЕСТИРОВАНИЕ

до размераПапка поставщика

Size 57,0 МБ (5,98,29,604 байт)

Size on disk 75,2 МБ (7,88,80 768 байт)

Contains 12 455 файлов, 2 294 папки

Теперь выполните команду

php artisan clean:vendor

РазмерПапка поставщика после выполнения команды

Size 47,2 МБ (4,93,51,781 байт)

Size on disk 59,7 МБ (6,26,76,992 байт)

Contains 8,431 файлов, 1570 папок

Надеюсь, что это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...