donatorsky / vendor-compress
将供应商目录压缩成单个 vendor.phar 文件
Requires
- php: >=7.1
- ext-json: *
- ext-phar: *
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.14.0
- fzaninotto/faker: ^1.8
- jangregor/phpstan-prophecy: ^0.2.0
- phpstan/phpstan: ^0.10.7
- phpstan/phpstan-phpunit: ^0.10.0
- phpunit/phpunit: ^7.5
- roave/security-advisories: dev-master
- symfony/finder: ^4.2
This package is auto-updated.
Last update: 2024-09-12 23:20:58 UTC
README
将供应商目录压缩成单个 vendor.phar 文件。
这是一个完全为了乐趣和作为PoC的项目。通常不需要压缩供应商目录来节省几兆字节。
这个项目的想法最近产生了,当时我必须在一个非常受限的环境中工作(一个10MiB磁盘空间的访问卡页面服务器)并且每个字节都很重要。我决定分享这个解决方案,也许它对某人有用。
该包尽可能简单。
它做什么?
基本上,它将 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
已经被排除(这是由于 RecursiveDirectoryIterator 与 RecursiveCallbackFilterIterator 的工作方式)。待未来修复:) - 假设存在
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 是一个好主意(最初它是这样使用的)?