我上次使用Laravel是很久以前的事,所以我决定重新使用它。
现在来自CodeIgniter,它在当时是一个功能强大的框架,我很高兴将项目上传到网站,因为包含框架文件的“系统”文件夹仅包含121个文件。
但是,基于作曲家的解决方案的问题是,一个很小的项目可能会变得庞大,比过去的大型CodeIgniter项目要大得多。有时仅使用一种方法,所有依赖项都有测试文件夹,文档和大量模块。
使用官方文档中的说明创建一个空的Laravel项目时,我大吃一惊,并看到包含超过8,000个文件的“ vendor”文件夹! (不计算文件夹)并且它什么也没做。.那是在使用--prefer-dist
标志时。
所以我的问题是,是否有办法选择更具选择性的空Laravel项目,因为服务器通常只有有限的Inode且每个项目有8,000个文件+文件夹,这会使您真正迅速达到极限(如果可以的话,要永久上载)在服务器上不安装composer。
答案 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个文件夹
希望有帮助