Composer 自定义发布包
Composer custom release package
我有一个 GIT 存储库,它创建可以通过 Composer 下载和安装的版本。
这些版本当前创建包含整个存储库的 tarball。问题是存储库很大,我不需要全部内容。
除此之外还有一个编译、合并等构建过程,并提供一个小得多的包。
我想要上传来自构建过程的存档,并在作曲家要求时提供该包作为下载。
就目前情况而言,我不认为这是一种选择。即使我上传自定义 archive.tar.gz composer 仍然会下载来自 GIT 标签的原始 tarball 文件(包含每个文件的巨大 tarball)。
这个问题有什么解决办法吗?
创建您自己的 bash 或 shell 脚本来完成您所有的脏活累活。您的 bash 脚本应该在安装过程中通过 composer 触发。
在脚本中通过 SCP 命令包括软件包安装、zip 存档和上传。这将为您完成所有工作。请务必在您的自述安装说明中提及,该用户需要 运行 composer install 具有 sudo 权限或管理员权限。
下面是一些链接供参考使用 shell 脚本
https://getcomposer.org/doc/articles/scripts.md
https://edmondscommerce.github.io/composer/composer-run-utility-bash-script.html
我相信您正在寻找的是将 composer.json 设置为使用 dist
而不是 auto
作为其 preferred-install
:
https://getcomposer.org/doc/06-config.md#preferred-install
然后您可以在 github 中使用适当的标签创建一个新版本,并在那里上传二进制文件。
PS:我还没有测试过这个,但看起来应该可以。
加入composer.json
"repositories": [
{
"type": "path",
"url": "./laravel-package-name"
}
],
并使用项目文件夹
中的代码创建新文件夹laravel-package-name
我最终创建了 php class 来处理 Composer 抛出的 pre-package-install
事件。
<?php
namespace Company\Composer;
use Composer\Installer\PackageEvent;
require_once(__DIR__ . "/../../../vendor/autoload.php");
class EventHandler
{
public static function prePackageInstall(PackageEvent $event)
{
$operation = $event->getOperation();
$package = $operation->getPackage();
if ($package->getName() !== 'company/repo-name') {
return;
}
$distUrl = 'https://github.com/company/repo-name/releases/download/%s/archive.zip?access_token=%s';
$package->setDistUrl(sprintf($distUrl, "v" . $package->getFullPrettyVersion(), '[GITHUB-USER-TOKEN]'));
}
}
注意 [GITHUB-USER-TOKEN]
如果包在私有仓库中(例如我的情况),则需要注意。
在composer.json
"pre-package-install": [
"Company\Composer\EventHandler::prePackageInstall"
],
我有一个 GIT 存储库,它创建可以通过 Composer 下载和安装的版本。
这些版本当前创建包含整个存储库的 tarball。问题是存储库很大,我不需要全部内容。
除此之外还有一个编译、合并等构建过程,并提供一个小得多的包。
我想要上传来自构建过程的存档,并在作曲家要求时提供该包作为下载。
就目前情况而言,我不认为这是一种选择。即使我上传自定义 archive.tar.gz composer 仍然会下载来自 GIT 标签的原始 tarball 文件(包含每个文件的巨大 tarball)。
这个问题有什么解决办法吗?
创建您自己的 bash 或 shell 脚本来完成您所有的脏活累活。您的 bash 脚本应该在安装过程中通过 composer 触发。 在脚本中通过 SCP 命令包括软件包安装、zip 存档和上传。这将为您完成所有工作。请务必在您的自述安装说明中提及,该用户需要 运行 composer install 具有 sudo 权限或管理员权限。
下面是一些链接供参考使用 shell 脚本
https://getcomposer.org/doc/articles/scripts.md
https://edmondscommerce.github.io/composer/composer-run-utility-bash-script.html
我相信您正在寻找的是将 composer.json 设置为使用 dist
而不是 auto
作为其 preferred-install
:
https://getcomposer.org/doc/06-config.md#preferred-install
然后您可以在 github 中使用适当的标签创建一个新版本,并在那里上传二进制文件。
PS:我还没有测试过这个,但看起来应该可以。
加入composer.json
"repositories": [
{
"type": "path",
"url": "./laravel-package-name"
}
],
并使用项目文件夹
中的代码创建新文件夹laravel-package-name我最终创建了 php class 来处理 Composer 抛出的 pre-package-install
事件。
<?php
namespace Company\Composer;
use Composer\Installer\PackageEvent;
require_once(__DIR__ . "/../../../vendor/autoload.php");
class EventHandler
{
public static function prePackageInstall(PackageEvent $event)
{
$operation = $event->getOperation();
$package = $operation->getPackage();
if ($package->getName() !== 'company/repo-name') {
return;
}
$distUrl = 'https://github.com/company/repo-name/releases/download/%s/archive.zip?access_token=%s';
$package->setDistUrl(sprintf($distUrl, "v" . $package->getFullPrettyVersion(), '[GITHUB-USER-TOKEN]'));
}
}
注意 [GITHUB-USER-TOKEN]
如果包在私有仓库中(例如我的情况),则需要注意。
在composer.json
"pre-package-install": [
"Company\Composer\EventHandler::prePackageInstall"
],