管理作曲家和部署

Posted

技术标签:

【中文标题】管理作曲家和部署【英文标题】:Managing composer and deployment 【发布时间】:2015-03-22 06:09:55 【问题描述】:

所以,我很喜欢使用 composer,但我很难理解其他人如何将它用于部署服务。目前我正在使用 deployhq,是的,我可以将其设置为在 repo 有更新时部署和运行 composer,但现在这对我来说没有意义。

我的主要作曲家 repo 只包含我想要包含在我的构建中的所有包的 json 文件,只有在我向列表中添加新包时才会更新。

当我更新我的主题或自定义扩展(在 json 文件中引用)时,没有“挂钩”来更新我的部署服务。所以我必须登录到我的服务器并手动运行作曲家(它会关闭网站直到它完成)。

那么其他人如何管理这个?我应该只在本地运行 composer 并将 vendor 文件夹包含在我的 repo 中吗?

任何答案将不胜感激。

詹姆斯

【问题讨论】:

【参考方案1】:

总会有关于执行此类事情的最佳方法的争论,并且有不同的答案和不同的选择 - 诀窍是找到最适合您的方法。

首先

我会先退后一步,看看你是如何管理你的 composer.json

我建议您将 composer.json 中的所有包都锁定为 Packagist 中项目的确切版本号。如果您将 github 存储库用于任何包(或将它们设置为 dev-master),那么我将确保这些包被锁定到特定的提交哈希!听起来你基本上就在那里,因为你在运行它时没有说任何更新包。

为什么?

这是为了确保当您在服务器上运行 composer update 时,如果这些包存在,它们会从缓存中获取,并确保如果其中一个模块在您测试和测试之间发生更新,您不会意外部署未经测试的代码你的部署。

实际部署

可能的方法一

我的观点有点争议,因为当涉及到我的许多不通过 CI 系统的项目的 Composer 时,我会将整个供应商目录提交给版本控制。这很简单,以确保我在任何阶段都有一个完全可部署的分支,它还使部署非常快速和容易(git pull)。

已经有人说这是不必要的,锁定版本号就足以确保处理任何远程系统故障,它会阻塞 VCS 树等 - 我现在不会讨论这些,有赞成和反对的论据(很多都是基于意见的),但正如你在问题中提到的那样,我想我会让你知道它在过去的很多项目中对我很有帮助,而且它是一个可行的选项。

可能的方法2

通过在您的服务器上使用符号链接到您的文档根目录,您可以在确认构建完成后将符号链接切换到新目录之前确保构建完成。 这是在服务器上使用 composer update 安全部署基本代码集的阻力最小的途径。我实际上将这种方法与我的大部分部署(包括上面和下面的)结合使用。

可能的方法3

Composer 可以使用“工件”而不是远程服务器,这意味着您基本上将创建供应商文件的“存储库文件夹”,这是将整个供应商文件夹添加到 VCS 的替代方法 - 但它还可以保护您免受 Github / Packagist 中断 / 文件被删除以及各种其他潜在问题的影响。这些文件从 artifacts 文件夹中检索并直接从 zip 文件中安装,而不是从服务器中检索 - 此文件夹可以远程存储 - 将其视为一个可怜的 mans 私人包装师(顺便说一句,另一种选择)。

IMO - 总体上最好的方法

设置一个 CI 系统(如 Jenkins),为您的应用程序创建一些测试,并让它们响应您的 VCS 上的推送 webhook,以便在每次推送某些内容时构建它。在此构建中,您将系统设置为:

在您的应用程序上运行测试(如果存在) 运行作曲家更新 生成这些文件的工件(如果上述项目成功)

如果您愿意,Jenkins 也可以为您进行实际部署(并且构建过程不会失败),它可以:

通过 SSH 将工件推送到服务器 使用脚本部署工件

但是,如果您已经有一个部署系统,那么部署一个经过测试的工件可能是它的部署场景之一。

希望这会有所帮助:)

【讨论】:

以上是关于管理作曲家和部署的主要内容,如果未能解决你的问题,请参考以下文章

当供应商在 Symfony 2.1 中不受作曲家管理时,在哪里注册自动加载?

如何打开Laravel背包管理页面?

Laravel 文件管理器非法偏移类型

编辑在 composer 中管理的多个 PHP 包

无法使用 symfony 5 安装奏鸣曲管理员

Hyperledger Composer 中的 JWT 身份验证失败