civicrm / composer-downloads-plugin
用于在任何composer包内下载额外文件的Composer插件。
Requires
- php: >=7.2
- composer-plugin-api: ^2.0
- civicrm/gitignore: ~1.2.0
Requires (Dev)
- composer/composer: ~2.0
- friendsofphp/php-cs-fixer: ^2.3
- phpunit/phpunit: ^8.5 || ^9.5
- totten/process-helper: ^1.0.1
This package is auto-updated.
Last update: 2024-09-09 21:45:04 UTC
README
"下载"插件允许您下载额外的文件(*.zip 或 *.tar.gz)并在您的包内提取它们。
示例
假设您发布了一个依赖外部工件 examplelib-0.1.zip 的PHP包 foo/bar
。将此配置放置在 foo/bar
的 composer.json
文件中
{ "name": "foo/bar", "require": { "civicrm/composer-downloads-plugin": "~3 || ~4" }, "extra": { "downloads": { "examplelib": { "url": "https://example.com/examplelib-0.1.zip", "path": "extern/examplelib", "ignore": ["test", "doc", ".*"] } } } }
当 foo/bar
的下游用户运行 composer install
时,它将获取并提取zip文件,创建 vendor/foo/bar/extern/examplelib
。
版本历史
- v1.x: lastcall/composer-extra-files 的原始发布
- v2.x: 分支。添加测试套件。重命名为 composer-downloads-plugin(extra.downloads)。改进跟踪/重新下载行为。添加更多下载选项。扩展文档。
- v3.x: 添加对 composer v2 的支持。
- v4.x: 改进PHP 8.2+。交换 gitignore 解析器。删除 composer v1。
评估
composer-downloads-plugin
的主要优点是
- 简单:它下载一个URL(ZIP/TAR文件)并提取它。它只需要知道两件事:要下载什么(url)和放置在哪里(path)。它作为纯PHP运行,没有外部依赖。
- 快速:逻辑不需要扫描、索引或映射任何大型注册表。下载系统使用 composer 内置的缓存。
- 隔离:作为包
foo/bar
的作者,您定义vendor/foo/bar
目录下的内容。当其他人使用foo/bar
时,无需特殊说明,无需根级配置,无需与其他包交互。
"下载"插件仅是一个下载机制。请使用它来融合外部资源作为 composer 包的一部分。
"下载"插件不是一个依赖项管理系统。它没有逻辑来扫描注册表、解决传递依赖项、识别版本冲突等。如果需要该功能,则可能需要将 composer 与外部依赖项管理工具集成的桥梁。以下是一些值得考虑的桥梁
配置:属性
extra.downloads
部分包含要下载的文件列表。每个额外文件都有一个符号ID(例如上面的 examplelib)和一些属性组合
-
url
:从该URL获取内容。 -
path
:内容将被提取到的相对路径。 -
type
:(可选) 确定如何处理下载archive
:url引用一个zip或tarball,应该在给定的 path 中提取。(对于涉及 *.zip、*.tar.gz 或 *.tgz 的URL的默认值。)file
:url应该下载到给定的 path。(对于所有其他URL的默认值。)phar
:url引用一个PHP可执行文件,应该在给定的 path 中安装。
-
ignore
:(可选) 一份应从提取文件夹中省略的文件列表。(这支持 .gitignore 表示法的一个子集。) -
version
(可选):下载实体的版本号。这不会对实体的生命周期产生功能性的影响,但它可能会影响控制台输出,并且可以可选地用作设置url
或path
时的变量。
url
和path
支持以下变量:
{$id}
:下载的符号标识符。(在介绍性示例中,它将是examplelib
。){$version}
:包显示/模拟/美观的版本号。
配置:默认值
您可以设置所有下载的默认属性。将它们放在*
下,如下所示:
{ "extra": { "downloads": { "*": { "path": "bower_components/{$id}", "ignore": ["test", "tests", "doc", "docs"] }, "jquery": { "url": "https://github.com/jquery/jquery-dist/archive/1.12.4.zip" }, "jquery-ui": { "url": "https://github.com/components/jqueryui/archive/1.12.1.zip" } } } }
此示例将:
- 创建
bower_components/jquery
(基于jQuery 1.12.4),不包括任何测试/文档文件夹。 - 创建
bower_components/jquery-ui
(基于jQueryUI 1.12.1),不包括任何测试/文档文件夹。
提示
-
在每次下载的文件夹中,此插件将创建一个小型元数据文件夹(
.composer-downloads
)以跟踪当前代码的来源。如果您修改composer.json
以使用不同的URL,那么它将重新下载文件。 -
将每个额外文件下载到不同的
path
。不要尝试下载到重叠的路径。(这尚未经过测试,但我预计下载没有很好地排序,您可能会发现更新需要重新下载。) -
如果您通常将额外文件下载为
*.tar.gz
,但有时(对于本地开发)需要从其他地方获取最新的内容,您应该怎么做?只需删除自动下载的文件夹并替换为您自己的。composer-downloads-plugin
将检测到这种冲突(由于缺少.composer-downloads
),并将您的代码保持原样(直到您选择将其删除)。要切换回,您可以简单地删除代码并再次运行composer install
。
已知限制
如果您在根项目(或符号链接的dev仓库)中使用downloads
,它将创建+更新下载,但不会自动删除孤立的项。这可以通过对.composer-downloads
进行文件扫描(并删除任何孤立的文件夹)来解决这个问题。由于这种情况目前并不常见,并且文件扫描可能会耗时,因此它可能是一个单独子命令的好主意。
我相信这个限制不会影响依赖项的下层消费者。在这种情况下,常规的composer
安装/更新/删除机制应该会处理任何嵌套的下载。
自动化测试
tests/
文件夹包含使用PHPUnit编写的单元测试和集成测试。每个集成测试都会生成一个包含合理、代表性的composer.json
文件的新文件夹/项目,并执行composer install
。它检查输出是否有预期的文件。
要运行测试,您需要在PATH
中安装composer
和phpunit
。
[~/src/composer-downloads-plugin] which composer
/Users/myuser/bin/composer
[~/src/composer-downloads-plugin] which phpunit
/Users/myuser/bin/phpunit
[~/src/composer-downloads-plugin] phpunit
PHPUnit 5.7.27 by Sebastian Bergmann and contributors.
..... 5 / 5 (100%)
Time: 40.35 seconds, Memory: 10.00MB
OK (5 tests, 7 assertions)
集成测试可能有点大/慢。为了更密切地监控测试,设置DEBUG
变量,如下所示:
[~/src/composer-downloads-plugin] env DEBUG=2 phpunit
本地开发工具
如果您想创建一个使用当前插件代码的环境——一个可以在迭代代码时快速重新运行composer
命令的环境,该怎么办?
您可以使用任何集成测试来初始化基线环境。
env USE_TEST_PROJECT=$HOME/src/myprj DEBUG=2 phpunit tests/SniffTest.php