小编典典

使用 Composer 的开发/生产切换时如何正确部署?

all

Composer
可以选择仅在开发时加载多个依赖项,因此这些工具不会安装在生产中(在实时服务器上)。这(理论上)对于仅在开发中才有意义的脚本非常方便,例如测试、假数据工具、调试器等。

要走的路是require-dev用你在开发中需要的工具添加一个额外的块:

"require-dev": {
    "codeception/codeception": "1.6.0.3"
}

然后(理论上)通过加载这些依赖项

composer install --dev

问题和问题:

Composer 已在 2013 年显着改变了行为,install现在默认安装 -dependencies (!),随意创建带有块的
composer.json 并执行重现。update``require-dev``require-dev``composer install

由于最被接受的部署方式是推送作曲家。 锁定 (保存您当前的作曲家设置),然后composer install在生产服务器上执行,这也将安装开发的东西。

在不 安装 -dev 依赖项的情况下部署它的正确方法是什么?

注意:我试图在这里创建一个规范的 Q/A 来澄清奇怪的 Composer 部署。随意编辑这个问题。


阅读 88

收藏
2022-06-29

共1个答案

小编典典

为什么

--dev恕我直言,Composer 现在默认使用该标志(在安装 更新时)是有充分理由的。Composer 主要在需要行为的场景中运行:

Composer 的基本工作流程如下:

  • 一个新项目启动:composer.phar install --dev, json 和 lock 文件被提交到 VCS。
  • 其他开发人员开始从事该项目:检查 VCS 和composer.phar install --dev.
  • 开发人员添加依赖项:composer.phar require <package>--dev如果您想要该require-dev部分中的包(并提交),请添加。
  • 其他人一起去:(结帐和)composer.phar install --dev
  • 开发人员想要更新版本的依赖项:(composer.phar update --dev <package>和提交)。
  • 其他人一起去:(结帐和)composer.phar install --dev
  • 项目部署:composer.phar install --no-dev

如您所见,--dev标志的使用(远)多于--no-dev标志,尤其是当从事该项目的开发人员数量增加时。

生产部署

在不安装“dev”依赖项的情况下部署它的正确方法是什么?

好吧,composer.jsonandcomposer.lock文件应该提交给
VCS。不要省略composer.lock,因为它包含有关应使用的包版本的重要信息。

执行生产部署时,您可以将--no-dev标志传递给 Composer:

composer.phar install --no-dev

composer.lock文件可能包含有关开发包的信息。这没关系。该--no-dev标志将确保未安装这些开发包。

当我说“生产部署”时,我指的是旨在用于生产的部署。我不是在争论是否composer.phar install应该在生产服务器上完成,还是在可以审查事情的登台服务器上完成。这不是这个答案的范围。我只是指出如何composer.phar install不安装“开发”依赖项。

无关

--optimize-autoloader标志在生产中也可能是可取的(它会生成一个类映射,这将加速您的应用程序中的自动加载):

composer.phar install --no-dev --optimize-autoloader

或者当自动部署完成时:

composer.phar install --no-ansi --no-dev --no-interaction --no-plugins --no-progress --no-scripts --optimize-autoloader

如果你的代码库支持它,你可以--optimize-autoloader换成--classmap-authoritative.
更多信息在这里

2022-06-29