部署到使用Symfony Flex的生产环境中--无开发人员

部署到使用Symfony Flex的生产环境中--无开发人员,symfony,composer-php,symfony4,symfony-flex,Symfony,Composer Php,Symfony4,Symfony Flex,我有几个大型Symfony项目,并注意到在将所有内容更新到Symfony 4(Flex)之后,当我们的部署自动化运行其正常过程时: composer安装--无开发人员 我们最终(例如)得出以下结论: 然后,正如预期的那样,这将导致对symfony.lock和config/bundles.php以及其他内容的更改,具体取决于composer.json中的require dev 确切地说,这一切都不是破坏性的,但是生产部署不再具有干净的git状态输出,并且可能会导致对实际部署内容的混淆,这是令人恼火

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

composer安装--无开发人员

我们最终(例如)得出以下结论:

然后,正如预期的那样,这将导致对
symfony.lock
config/bundles.php
以及其他内容的更改,具体取决于
composer.json
中的
require dev

确切地说,这一切都不是破坏性的,但是生产部署不再具有干净的
git状态
输出,并且可能会导致对实际部署内容的混淆,这是令人恼火的

有各种解决方法,例如,我可以将所有内容都放在
require
中,而不是
require dev
,因为部署这些内容不会造成实际伤害,或者我可以省略Composer命令的
--no dev
部分


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

如果您从主分支部署到prod,您可以设置一个部署分支。在该分支中,您可以防止某些文件被合并到。这会造成这样一种情况:您有一个主分支,一个版本分支(例如:3.21.2),并且您让开发人员签出主分支,处理它,然后将它们的更改合并到版本分支中。从这里,您可以选择部署到prod的内容。(这里会有一个小的平衡动作。您需要将所有开发更改合并到master中,直到它与您的版本分支匹配,并确保master在部署后与版本匹配。这会增加一些工作,您必须关注它。等等)

另一种选择是将git存储库与部署目录分开,在
/var/repo/site.git
中创建一个git目录,部署目录为
/var/www/domain.com
,接收到对repo/site目录的推送后,使用post接收git钩子自动更新www目录。显然,您在www目录中运行composer、npm、gulp和whathaveyou,git目录保持原样


无需进入商业选项(如连续部署应用程序),您就可以编写部署脚本。有很多方法可以编写一个shell脚本,它接受一个目录并复制它,运行composer,运行npm,等等。所有这些都在一个命令中完成——将git与部署目录分离。下面是一个示例,它使用当前日期时间命名一个目录,然后将其符号链接到部署目录

您是否将
symfony.lock
文件提交给回购?部署时需要避免此问题。可能与@yceruto有关。是的,
symfony.lock
处于版本控制之下。实际上,问题正好相反:由于指定了
--no dev
,Flex认为
require dev
的成员正在被删除,因此它基于相应配方中的
manifest.json
运行取消配置步骤。在我的示例中,这意味着删除
phpunit.xml.dist
文件,并从
config/bundles.php
中删除Maker捆绑包。似乎应该有一种方法来防止在生产部署中出现这种行为。奇怪的是:我无法在最新版本的Flex上重现这个问题。只有当我的
symfony.lock
在部署时存在差异时,我才能看到问题。
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