使用Symfony Flex和--no-dev部署到生产环境

fut*_*eal 10 symfony composer-php symfony-flex symfony4

我有几个大的Symfony项目,并注意到在将所有内容更新到Symfony 4(Flex)之后,当我们的部署自动化运行其正常过程时:

composer install --no-dev

我们最终得到(例如)这个:

Symfony operations: 2 recipes (72fad9713126cf1479bb25a53d64d744)
  - Unconfiguring symfony/maker-bundle (>=1.0): From github.com/symfony/recipes:master
  - Unconfiguring phpunit/phpunit (>=4.7): From github.com/symfony/recipes:master
Run Code Online (Sandbox Code Playgroud)

然后,正如预期的那样,这会导致更改为symfony.lockconfig/bundles.php,以及其他任何内容,具体取决于其中包含require-dev的内容composer.json.

这些都不是完全破坏,但让生产部署不再具有干净的git status输出是令人讨厌的,并且可能导致对实际部署的内容产生混淆.

对此有各种解决方法,例如我可以放入所有内容require而不是require-dev因为在部署这些内容时没有真正的危害,或者我可以省略--no-devComposer命令的一部分.

但实际上,这里的正确做法是什么?如果您只是部署一个锁定的软件,就没有办法告诉Flex不对配置进行任何更改,这似乎很奇怪.这是一个功能请求,还是我在这里错过了一些配置?

Oll*_*PGH -1

如果您从 master 分支部署到 prod,则可以设置一个部署分支。在该分支中,您可以阻止某些文件被合并。有关更多详细信息,请参阅这篇文章。这会创建一种情况,您有一个主分支、一个版本分支(例如:3.21.2),并且您有开发人员签出主分支,对其进行处理,然后将它们的更改合并到版本分支中。从那里您可以选择部署到产品的内容。(这里会有一个小的平衡行为。您需要将所有开发更改合并到 master 中,直到它与您的版本分支匹配,并确保 master 与您部署后的版本匹配。这会增加一些工作,您必须留意它等等)

另一种选择是将 git 存储库与部署目录分开。在此示例中,创建了 git 目录/var/repo/site.git,部署目录为/var/www/domain.com,并且使用 post-receive git hook 在收到推送到 repo/site 目录后自动更新 www 目录。显然,您在 www 目录中运行composer、npm、gulp、whathaveyou,而 git 目录保持原样。

您可以编写部署脚本,而无需考虑持续部署应用程序等商业选项。有很多方法可以编写一个 shell 脚本,该脚本需要一个目录并将其复制、运行 Composer、运行 npm 等,所有这些都在一个命令中完成——将 git 与部署目录分开。这是一个简单的方法,它使用当前日期时间来命名目录,然后将其符号链接到部署目录。