在 运行 使用 deployer 部署时如何检查是否有迁移

How can you check if there are migrations while running a deploy using deployer

我正在使用 Deployer 将我的 Symfony 应用程序部署到生产环境中。一切正常,但是,我的 deploy.php 文件有数据库迁移命令:

/**
* Run a diff to generate migrations, 
*/
task('database:diff', function () {

run('{{bin/php}} {{release_path}}/' . trim(get('bin_dir'), '/') . '/console doctrine:migrations:diff --env={{env}} --no-debug --no-interaction');

})->desc('Generate migrations database');

...

after('deploy:symlink','database:diff');
after('database:diff','database:migrate');

但是如果数据库没有变化那么这一步会出错。

错误信息:

[RuntimeException]                                                                                                                                                                                      

[Doctrine\DBAL\Migrations\MigrationException]                                                                                                                                                         
Could not find any migrations to execute.

我正在寻找一些可以检查任何数据库更改的代码,并且只有在有更改时才有条件地 运行 迁移任务。

嗯,这是一种奇怪的自动化迁移和数据库版本控制方法。

我们就是这样做的:

每个开发人员都会生成他们的迁移;

  1. Add/remove 实体中的字段(或创建新实体)
  2. 运行 $ php app/console doctrine:migrations:diff 迁移是在本地创建的。
  3. 开发人员然后打开该迁移以确保一切正常,或者添加他们的额外迁移 queries/migrations 等
  4. 然后他们 commit/push 迁移到存储库,以便所有迁移都由 git 控制版本。
  5. 其他开发人员提取这些迁移,并在必要时 运行 在他们的本地计算机上进行迁移。

在部署期间,不需要 运行 diff,因为所有的 diff 都在 git 存储库中,所以您只需 运行 database:migrate 更新您的 prod 数据库到最新版本。

提示:生成迁移时,最好为每个 entity/database table 生成一个迁移,就好像某些 sql 查询会在您的大迁移中失败一样,这将是已经被处决的很难回滚