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

11

我有几个大型的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

然后,如预期的那样,这将导致 symfony.lockconfig/bundles.php 的更改,还可能会根据composer.json文件中的require-dev包含的内容而进行其他更改。

严格来说,这并不是一个破坏性的变化,但是部署到生产环境后不能再使用干净的 git status 命令输出确实很让人烦恼,并且会导致混淆,不知道实际上部署了什么。

有各种解决方法,例如我可以将所有东西都放在 require 中而不是 require-dev,因为将那些东西部署出去并没有任何实质性的危害,或者我可以省略 Composer 命令中的 --no-dev 部分。

但是,真正的正确做法是什么?看起来奇怪的是,如果您只是部署了一款锁定的软件,就没有办法告诉 Flex 不要更改配置。这是一个功能请求,还是我在配置上遗漏了一些细节?


1
你是否已经将 symfony.lock 文件提交到仓库?这是为了避免部署时出现问题所必需的。 - yceruto
可能与https://dev59.com/iabja4cB1Zd3GeqPgXAu相关。 - yceruto
@yceruto 是的,symfony.lock 在版本控制下。实际上问题相反:由于指定了 --no-dev,Flex 认为正在删除 require-dev 的成员,因此它根据适当的配方中的 manifest.json 运行未配置步骤。在我的示例中,这意味着删除 phpunit.xml.dist 文件并从 config/bundles.php 中删除 Maker bundle。似乎应该有一种方法可以防止在生产部署时出现这种行为。 - futureal
奇怪:/我无法在最新版本的Flex上重现这个问题。只有当我的symfony.lock在部署时有差异时,我才能看到这个问题。 - yceruto
2个回答

1
这在旧版Symfony Flex 1中曾经是一个问题。它在这里被报告,并在这里得到修复。
如果你遇到了这个问题,那意味着你的安装版本非常老旧,你应该尽力将Symfony Flex至少更新到更高版本(Symfony Flex 1已经无法工作,所以如果可能的话切换到Flex 2是唯一的方法,或者直接在生产环境中删除Flex)。

这是一个非常好的建议。更新到最新版本的Flex。只有在不可能的情况下才删除Flex。但是在我看来,每个使用Flex的项目都可以升级。 - Alexandre Tranchant

-1
如果您从主分支部署到生产环境,可以设置一个部署分支。在该分支中,您可以防止某些文件被合并。请参阅此帖子以获取更多详细信息。这将创建这样一种情况:您有一个主分支、一个版本分支(例如:3.21.2),您的开发人员会检出主分支,在其上工作,然后将更改合并到版本分支中。然后,您可以挑选要部署到生产环境的内容。(这里需要进行一些平衡。您需要将所有开发更改合并到主分支中,直到它与您的版本分支匹配,并确保主分支在部署后与版本匹配。这增加了一些工作量,您需要密切关注等等。)

另一种选择是将您的git仓库与部署目录分开。在本示例中,创建了一个git目录/var/repo/site.git,部署目录为/var/www/domain.com,并使用post-receive git挂钩在推送收到后自动更新www目录。您可以在www目录中运行composer、npm、gulp等命令,而git目录保持原样。

如果不涉及商业选项,例如持续部署应用程序,您可以编写一个部署脚本。有很多方法编写shell脚本,它可以使用一个命令将一个目录复制到另一个目录,并运行composer、运行npm等--从而将git与部署目录分开。这里是一个简单的脚本,它使用当前日期时间来命名目录,然后将其符号链接到部署目录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接