构建包安装程序

发布于 作者

Building Package Installers image

我认为我们大多数使用 Laravel 一段时间的人都很熟悉包安装流程:通过 Composer 添加包,注册服务提供者,发布配置文件,更新环境文件,希望你能记得更新 .env.example,并且在完成所有操作后,你希望自己没有遗漏任何步骤。这通常涉及从 README 中复制粘贴,并在编辑器和浏览器之间来回切换。随着 Laravel 5.5 的发布,我们对这个流程有了很大的改进,引入了 包发现,但这并没有改变这个流程本身。

当我开始构建 Laravel 的 Honeybadger 集成时,我几乎从未见过 PHP 包的安装命令。我能想到的唯一一个命令是 Laravel Spark。当我们开始为集成概述功能时,Josh 建议构建一个类似于 Ruby gem 中的安装命令。我认为这是一个非常棒的想法,它将使安装流程更加顺畅。

我对添加此功能有一些非常具体的目标

  • 显示所有执行的任务(成功和失败)
  • 尽可能避免手动操作
  • 使用命令提示符获取任何所需的信息
  • 兼容 Laravel 和 Lumen

可见性

我真的不希望这个安装程序只是在后台运行,修改你的许多文件,然后只是返回一个消息说一切都很成功。我也不会希望输出过于冗长。

我偶然发现了 Nuno Maduro 的一个很棒的包 nunomaduro/laravel-console-task。我真的很喜欢它简单的 API 和漂亮的输出。然而,它在 Lumen 中运行时遇到了一些问题,所以我编写了一个简单的类来收集任务名称和结果状态。

<?php
 
namespace Honeybadger\HoneybadgerLaravel;
 
use Illuminate\Console\OutputStyle;
 
class CommandTasks
{
/**
* @var \Illuminate\Console\OutputStyle
*/
protected $output;
 
/**
* @var array
*/
protected $results = [];
 
/**
* Set command output.
*
* @param \Illuminate\Console\OutputStyle $output
* @return self
*/
public function setOutput(OutputStyle $output) : self
{
$this->output = $output;
 
return $this;
}
 
/**
* Add task with result to the stack.
*
* @param string $name
* @param bool $result
* @return self
*/
public function addTask(string $name, bool $result) : self
{
$this->results[$name] = $result;
 
return $this;
}
 
/**
* Send results to the command output.
*
* @return void
*/
public function outputResults() : void
{
collect($this->results)->each(function ($result, $description) {
$this->output->writeLn(vsprintf('%s: %s', [
$description,
$result ? '<fg=green>✔</>' : '<fg=red>✘</>',
]));
});
}
 
/**
* Get the results of all tasks.
*
* @return array
*/
public function getResults() : array
{
return $this->results;
}
}

它保持了简单的 API 和漂亮的输出

$this->tasks->addTask(
'Write HONEYBADGER_API_KEY to .env',
$this->installer->writeConfig(
['HONEYBADGER_API_KEY' => $this->config['api_key']],
base_path('.env')
)
);

避免手动操作

使用安装程序的目的是使安装流程快速、简单且愉快。我发现安装新包最大的痛点之一是更新 .env 文件和 .env.example 文件。

我最终编写了一个非常轻量级的包来完成这项工作,即 sixlive/dotenv-editor

public function writeConfig(array $config, string $filePath) : bool
{
try {
$env = new DotenvEditor;
$env->load($filePath);
} catch (InvalidArgumentException $e) {
return false;
}
collect($config)->each(function ($value, $key) use ($env) {
$env->set($key, $value);
});
return $env->save();
}

然后我们可以使用该方法写入这两个环境文件。我们将在 .env.example 文件中写入一个空值,并将通过命令输入收集的 API 写入 .env 文件

private function writeEnv() : void
{
$this->tasks->addTask(
'Write HONEYBADGER_API_KEY to .env',
$this->installer->writeConfig(
['HONEYBADGER_API_KEY' => $this->config['api_key']],
base_path('.env')
)
);
$this->tasks->addTask(
'Write HONEYBADGER_API_KEY placeholder to .env.example',
$this->installer->writeConfig(
['HONEYBADGER_API_KEY' => ''],
base_path('.env.example')
)
);
}

我还想为 Laravel 和 Lumen 发布配置文件。使用 Laravel 非常简单,你可以调用 vendor:publish 命令。

public function publishLaravelConfig() : bool
{
return Artisan::call('vendor:publish', [
'--provider' => HoneybadgerServiceProvider::class,
]) === 0;
}

Lumen 则有点棘手,因为它缺少 Laravel 附带的许多命令。

public function publishLumenConfig(string $stubPath = null): bool
{
if (! is_dir(base_path('config'))) {
mkdir(base_path('config'));
}
return copy(
$stubPath ?? __DIR__.'/../config/honeybadger.php',
base_path('config/honeybadger.php')
);
}

在所有配置就位之后,我们需要向 Honeybadger 发送一个测试异常。这样做是为了确保所有配置和安装步骤都正确完成。

提示配置值

在执行任何安装任务之前,我们首先要收集所有配置值,以便我们可以一步完成所有安装操作。

public function handle()
{
$this->config = $this->gatherConfig();
}
 
private function gatherConfig() : array
{
return [
'api_key' => $this->argument('apiKey') ?? $this->promptForApiKey(),
'send_test' => $this->confirm('Would you like to send a test exception now?', true),
];
}
 
private function promptForApiKey() : string
{
return $this->requiredSecret('Your API key', 'The API key is required');
}

Laravel 使我们能够非常轻松地直接将所有配置值提示到一个关联数组中。这使得在整个命令中引用这些值变得超级简单。

我需要确保 API 密钥是必需的。我编写了一个非常简单的函数,它会持续提示输入 API,直到输入为止。

trait RequiredInput
{
public function requiredSecret($question, $failedMessage)
{
$input = $this->secret($question);
if (is_null($input)) {
$this->error($failedMessage);
return $this->requiredSecret($question, $failedMessage);
}
return $input;
}

总结

Honeybadger 团队非常努力地提供流畅、精致、愉快的端到端体验,我认为这与 Laravel 的一些核心原则完美契合。我认为,通过为包使用安装程序,它将这种体验从他们的应用程序带到了你的终端。我们正在对安装程序进行最后的润色,它将很快加入到 honeybadger-io/honeybadger-laravel 库中。你可以关注此处的 pull 请求 honeybadger-io/honeybadger-laravel/#11。同时,Honeybadger 仍然非常容易上手。

免费试用 Honeybadger 15 天

TJ Miller photo

我主要使用 Laravel 和 Vue。我的大部分工作都集中在 API 和 API 开发上。

归档于
Cube

Laravel 新闻稿

加入 40,000 多名其他开发者,不要错过任何新技巧、教程等。

Laravel Forge logo

Laravel Forge

轻松创建和管理你的服务器,并在几秒钟内部署你的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发者的必备代码运行器。使用 AI、自动完成和对本地和生产环境的即时反馈进行调试。

Tinkerwell
No Compromises logo

No Compromises

来自 No Compromises 播客的两位经验丰富的开发者 Joel 和 Aaron 现在可以为你的 Laravel 项目提供服务。 ⬧ 固定价格 7,500 美元/月。 ⬧ 没有冗长的销售流程。 ⬧ 没有合同。 ⬧ 100% 退款保证。

No Compromises
Kirschbaum logo

Kirschbaum

提供创新和稳定性,以确保你的 Web 应用程序成功。

Kirschbaum
Shift logo

Shift

运行旧版本的 Laravel?即时、自动化的 Laravel 升级和代码现代化,让你的应用程序保持最新。

Shift
Bacancy logo

Bacancy

让你的项目充满活力,只需每月 2,500 美元,就能获得经验丰富的 Laravel 开发者(拥有 4-6 年的经验)。获得 160 小时的专业知识和 15 天无风险试用。立即安排通话!

Bacancy
Lucky Media logo

Lucky Media

立即获得 Lucky - Laravel 开发的理想选择,拥有十多年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar: Laravel 电子商务

Laravel 电子商务。一个开源包,将现代无头电子商务功能的强大功能带到 Laravel。

Lunar: Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 工作板

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit: Laravel SaaS 启动工具包

SaaSykit 是一个 Laravel SaaS 启动套件,包含运行现代 SaaS 所需的所有功能。支付、精美结账、管理面板、用户仪表盘、身份验证、现成组件、统计数据、博客、文档等等。

SaaSykit: Laravel SaaS 启动工具包
Rector logo

Rector

您无缝升级 Laravel 的合作伙伴,降低成本,加速创新,助您企业取得成功

Rector
MongoDB logo

MongoDB

通过将 MongoDB 与 Laravel 强力集成,增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。支持事务、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。了解灵活的现代数据库 MongoDB 如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的零依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

将 Swagger UI 添加到您的 Laravel 应用程序

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel Prompts 构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的站点搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 包为您的 Laravel 应用程序添加评论

阅读文章