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

2022-08-30 06:23:28

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

要走的方法是使用您在开发中所需的工具添加一个额外的块:require-dev

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

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

composer install --dev

问题和疑问:

Composer 在 2013 年极大地改变了 -依赖项的行为,现在默认安装 (!),可以随意创建带有块的 composer.json 并执行一个再现。installupdaterequire-devrequire-devcomposer install

因为最被接受的部署方式是推动作曲家。锁定(保存您当前的作曲家设置),然后在生产服务器上执行一个,这也将安装开发内容。composer install

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

注意:我正在尝试在此处创建一个规范的 Q/A,以阐明奇怪的 Composer 部署。随意编辑这个问题。


答案 1

为什么

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

基本的 Composer 工作流如下所示:

  • 一个新项目已启动:、json 和锁文件将提交到 VCS。composer.phar install --dev
  • 其他开发人员开始处理该项目:检出VCS和.composer.phar install --dev
  • 开发人员添加依赖项:,如果您希望在部分(和提交)中包含包,请添加。composer.phar require <package>--devrequire-dev
  • 其他人一起去:(结帐和)。composer.phar install --dev
  • 开发人员需要较新版本的依赖项:(和提交)。composer.phar update --dev <package>
  • 其他人一起去:(结帐和)。composer.phar install --dev
  • 项目部署:composer.phar install --no-dev

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

生产部署

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

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

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

composer.phar install --no-dev

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

当我说“生产部署”时,我的意思是旨在用于生产中的部署。我不是在争论是否应该在生产服务器上完成,还是在可以查看事物的暂存服务器上完成。这不是本答案的范围。我只是指出如何在不安装“开发”依赖项的情况下进行操作。composer.phar installcomposer.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


答案 2

实际上,我强烈建议不要在生产服务器上安装依赖项。

我的建议是签出部署计算机上的代码,根据需要安装依赖项(这包括在代码投入生产时不安装 dev 依赖项),然后将所有文件移动到目标计算机。

为什么?

  • 在共享主机上,您可能无法访问命令行
  • 即使你这样做了,PHP也可能在命令,内存或网络访问方面受到限制。
  • 存储库 CLI 工具(Git,Svn)可能不会安装,如果您的锁定文件记录了签出某个提交的依赖项,而不是将该提交下载为 ZIP(您使用了 --prefer-source,或者 Composer 没有其他方法可以获得该版本),则此操作将失败
  • 如果您的生产计算机更像是一个小型测试服务器(想想 Amazon EC2 微型实例),则可能甚至没有足够的内存来执行composer install
  • 虽然作曲家试图不破坏一些东西,但你如何看待以一个部分破碎的生产网站结束,因为在作曲家安装阶段无法加载一些随机的依赖关系

长话短说:在您可以控制的环境中使用 Composer。您的开发计算机确实符合条件,因为您已经拥有操作 Composer 所需的所有功能。

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

要使用的命令是

composer install --no-dev

这将适用于任何环境,无论是生产服务器本身,还是部署计算机,或者应该进行最后检查以查找是否有任何开发要求被错误地用于实际软件的开发计算机。

该命令不会安装或主动卸载 composer.lock 文件中声明的开发要求。

如果您不介意在生产服务器上部署开发软件组件,则运行将执行相同的工作,但只需增加移动的字节量,并创建更大的自动加载程序声明。composer install


推荐