Laravel空白项目..那么多的文件!可以以某种方式减少吗?

时间:2019-05-31 03:07:38

标签: laravel laravel-5 composer-php

我上次使用Laravel是很久以前的事,所以我决定重新使用它。

现在来自CodeIgniter,它在当时是一个功能强大的框架,我很高兴将项目上传到网站,因为包含框架文件的“系统”文件夹仅包含121个文件。

但是,基于作曲家的解决方案的问题是,一个很小的项目可能会变得庞大,比过去的大型CodeIgniter项目要大得多。有时仅使用一种方法,所有依赖项都有测试文件夹,文档和大量模块。

使用官方文档中的说明创建一个空的Laravel项目时,我大吃一惊,并看到包含超过8,000个文件的“ vendor”文件夹! (不计算文件夹)并且它什么也没做。.那是在使用--prefer-dist标志时。

所以我的问题是,是否有办法选择更具选择性的空Laravel项目,因为服务器通常只有有限的Inode且每个项目有8,000个文件+文件夹,这会使您真正迅速达到极限(如果可以的话,要永久上载)在服务器上不安装composer。

2 个答案:

答案 0 :(得分:1)

Composer可以删除无关的文件。

在项目的composer.json中,使用archive和/或exclude-files-from-classmaps配置值指定不需要的文件,然后使用作曲者的archive命令创建一个拉链。上传zip并在服务器上展开,或在本地展开并传输现在较小的软件包。

$ cat composer.json
...
{
    "archive": {
        "exclude": ["/test/*", "/*.jpg" ]
    }
}
$ php composer.phar archive my/package 1.0.0 --format=zip

archive匹配的文件根本不会出现在您的zip中。与exclude-files-from-classmaps匹配的那些文件将存在于文件系统中,但对自动加载器不可见。

答案 1 :(得分:-1)

几天前我的处境相同,所以我创建了控制台命令来删除供应商目录

中未使用的文件

步骤: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 CPU @ 2.40GHz,2400 Mhz,2个Core,4个逻辑处理器

  

现在是测试部分

供应商文件夹大小之前

Size 57.0 MB(5,98,29,604字节)

Size on disk 75.2 MB(7,88,80,768字节)

Contains 12,455个文件,2,294个文件夹

现在运行命令

php artisan clean:vendor

运行命令后的供应商文件夹大小

Size 47.0 MB(4,93,51,781字节)

Size on disk 59.7 MB(6,26,76,992字节)

Contains 8,431个文件,1,570个文件夹

希望有帮助