donatorsky/vendor-compress

将供应商目录压缩成单个 vendor.phar 文件

v2.0.1 2019-01-12 10:41 UTC

This package is auto-updated.

Last update: 2024-09-12 23:20:58 UTC


README

将供应商目录压缩成单个 vendor.phar 文件。

这是一个完全为了乐趣和作为PoC的项目。通常不需要压缩供应商目录来节省几兆字节。

这个项目的想法最近产生了,当时我必须在一个非常受限的环境中工作(一个10MiB磁盘空间的访问卡页面服务器)并且每个字节都很重要。我决定分享这个解决方案,也许它对某人有用。

该包尽可能简单。

GitHub license Build

它做什么?

基本上,它将 vendor/ 目录的内容打包成单个 PHAR 文件,可选地进行压缩并执行其他磁盘空间优化。并尝试使其全部工作 :)

原始的 vendor/ 目录不会被删除或修改!

如何使用

生成 vendor.phar(或根据配置为 vendor.phar.gz 或 vendor.phar.bz2;见下文)文件

bin/vendor-compress [options] [<path>]

参数

选项

然后使用它

// Replace
require __DIR__ . 'vendor/autoload.php';

// With (add .gz/.bz2 if archive-compressed)
require __DIR__ . 'vendor.phar';

// Or replace with auto-detection of proper vendor source
is_file(__DIR__ . 'vendor.phar') ? require __DIR__ . 'vendor.phar' : require __DIR__ . 'vendor/autoload.php';

配置

为了更方便地管理配置,您可以创建一个专用文件,该文件将被加载。它必须返回一个 \Donatorsky\VendorCompress\Config 类的实例。这里有一个(见 .vendor_compress.dist),如果没有提供配置,它将作为一个后备方案工作

<?php
declare(strict_types=1);

use Donatorsky\VendorCompress\Config;
use Donatorsky\VendorCompress\FileFilters\BasenameFilter;
use Donatorsky\VendorCompress\FileFilters\BasenameRegexFilter;
use Donatorsky\VendorCompress\FileFilters\ExtensionFilter;
use Donatorsky\VendorCompress\FileFilters\IsDirectoryFilter;
use Donatorsky\VendorCompress\FileFilters\IsFileFilter;
use Donatorsky\VendorCompress\FileFilters\VendorPackageFilter;
use Donatorsky\VendorCompress\FileProcessors\MinifyJsonFileProcessor;
use Donatorsky\VendorCompress\FileProcessors\StripWhitespacesPhpFileProcessor;

return Config::create()
	->setFilesCompressionMethod(Phar::NONE) // It is also default
	->setArchiveCompressionMethod(Phar::NONE) // It is also default
	->setExcluded([
		new VendorPackageFilter('donatorsky', 'vendor-compress'),
		new IsDirectoryFilter(new BasenameFilter('docs')),
		new IsDirectoryFilter(new BasenameFilter('tests')),
		new IsFileFilter(new BasenameFilter('composer.json')),
		new IsFileFilter(new BasenameFilter('composer.lock')),
		new IsFileFilter(new BasenameFilter('.gitignore')),
		new IsFileFilter(new BasenameRegexFilter('/^(?:README|CHANGELOG|phpunit.*\.xml.*$)/i')),
	])
	->addFileProcessor(new MinifyJsonFileProcessor(), new ExtensionFilter('json'))
	->addFileProcessor(new StripWhitespacesPhpFileProcessor(), new ExtensionFilter('php'));

您可以在工作目录(通常是项目的根目录)中创建自己的 .vendor_compress.vendor_compress.dist 配置文件,或使用 --configuration 选项指定配置文件的路径。加载配置的顺序是:

  • 通过 --configuration 指定。如果不存在,命令将失败。
  • 当前工作目录 (CWD)/.vendor_compress,
  • CWD/.vendor_compress.dist,
  • vendor/donatorsky/vendor-compress/.vendor_compress.dist).

可用的配置选项

以下是所有可用选项的列表。

setFilesCompressionMethod(int $filesCompressionMethod)

允许设置用于单独压缩每个文件的压缩方法。 $filesCompressionMethod 应该是 \Phar::CONSTANT 常量中提供的支持压缩方法之一。

setArchiveCompressionMethod(int $archiveCompressionMethod)

允许设置用于压缩整个文件的压缩方法。与 setFilesCompressionMethod() 的区别在于,使用此选项,整个存档将在结束时一次性压缩。这样做可能更有效率(见下文比较)。 $archiveCompressionMethod 应该是 \Phar::CONSTANT 常量中提供的支持压缩方法之一。

setAlias(string $alias)

允许设置别名,通过该别名在调用流功能时引用生成的 Phar 存档。更多信息请见: https://secure.php.net/manual/en/phar.construct.php

addExcluded(\Donatorsky\VendorCompress\Contracts\FileFilterInterface $fileFilter)

允许添加用于生成供应商文件列表的文件/目录排除规则。已经包含了一些规则(见 src/FileFilters/),您可以使用这些规则,也可以编写自己的规则。

setExcluded(\Donatorsky\VendorCompress\Contracts\FileFilterInterface[] $fileFilters)

允许一次性设置多个文件/目录排除规则。这将覆盖现有的规则列表。

addIncluded(\Donatorsky\VendorCompress\Contracts\FileFilterInterface $fileFilter)

允许添加用于生成供应商文件列表的文件/目录包含规则。已经包含了一些规则(见 src/FileFilters/),您可以直接使用,或者编写自己的规则。包含规则优先于排除规则。但是,有一些值得注意的细节:

  • 默认情况下,vendor/ 目录的所有内容都会被包含。
  • 排除例如路径 vendor-name/package-name 将会排除该目录的内容。
  • 包含 vendor-name 目录将覆盖上述的排除设置。
  • 包含 vendor-name/package-name/subdirectory 将不会生效,因为 vendor-name/package-name 已经被排除(这是由于 RecursiveDirectoryIteratorRecursiveCallbackFilterIterator 的工作方式)。待未来修复:)
  • 假设存在 vendor-name/package-name/important_file.php。包含它也不会生效。

setIncluded(\Donatorsky\VendorCompress\Contracts\FileFilterInterface[] $fileFilters)

允许一次性设置多个文件/目录包含规则。这将覆盖现有的规则列表。

addFileProcessor(\Donatorsky\VendorCompress\Contracts\FileProcessorInterface $fileProcessor, \Donatorsky\VendorCompress\Contracts\FileFilterInterface $fileFilter, ...$moreFileFilters)

也存在文件处理器。它们定义了一些在文件被添加到归档前应执行的内容操作。例如,您可以压缩 PHP 代码。可以定义多个文件规则,对哪些内容应用内容操作。

压缩比例比较

初始 vendor/ 大小:43.348 MiB

文件数量:9664

排除后的文件数量:6992

注意:仅通过移除文档和测试(主要是)就可以使供应商的大小减少约 38%。

待办事项:将生成时间添加到上述比较中。

退出代码

所有退出代码常量都可以在 bin/constants.php 文件中找到。

使用技巧

  • PHAR 文件尝试 挂载 vendor/ 目录外的目录,并且目前仅在直接位于 vendor/ 目录上一级的路径上进行测试。如果您依赖于项目根目录外的某些路径,则自动加载可能无法正常工作。
  • 我认为对于生产环境最有用的是使用带有 --classmap-authoritative 选项的自动加载。为了使从 PHAR 文件中进行自动加载工作,我重写了生成的文件索引,因此它可能不适用于动态文件猜测和搜索。
  • 使用整个归档压缩时要小心。尽管它提供了更好的压缩比例,但也带来了额外的解压缩文件技巧(覆盖自定义 stub.php 脚本),这可能会破坏自动加载。文件压缩在这里更为可靠。

未来计划

  • 移除不必要的空白字符(即完成 \Donatorsky\VendorCompress\FileProcessors\StripWhitespacesPhpFileProcessor
  • 也许使用 symfony/console 是一个好主意(最初它是这样使用的)?