cytracom/squasher

将增量Laravel迁移文件聚合为每个表的单一迁移。这消除了所有修改列,使得通过sqlite进行测试成为可能。

dev-master 2013-11-21 16:20 UTC

This package is not auto-updated.

Last update: 2024-09-24 01:30:55 UTC


README

将增量Laravel迁移文件聚合为每个表的单一迁移。当需要将大量迁移集合压缩为每个表的单一迁移时,这可能是有益的。

此包还消除了所有修改列,因为所有迁移都聚合到一个文件中,这使得通过sqlite进行测试成为可能。

Build Status

要安装,只需要求

"cytracom/squasher": "dev-master"

然后,将服务提供者添加到您的app/config/app.php中,以启用artisan功能

'Cytracom\Squasher\SquasherServiceProvider'

注意:如果您不想使用命令行界面,则这不是必需的。如果您只想使用squasher进行测试,则可以忽略此服务提供者,并直接调用squasher。这样,squasher可以放在require-dev中,而不是成为您生产堆栈的一部分。

命令行使用

php artisan migrate:squash [-p|--path[="..."]] [-o|--output[="..."]] [-mv|--move-to[="..."]]                                                      
                                                                                                                                  
Options:                                                                                                                 
 --path (-p)           The path to the migrations folder (default: "app/database/migrations")                             
 --output (-o)         The path to the output folder of squashes (default: "app/tests/migrations")
 --move-to (-mv)       The path where old migrations will be moved. (default: "app/database/migrations")      

PHP中的使用方法

$squasher = new \Cytracom\Squasher\MigrationSquasher($pathToMigrations, $outputForSquashedMigrations [, $moveOldToThisPath = null]);
$squasher->squash();

目前squasher不支持复合键或索引。如果您发现我遗漏了其他内容,请提出问题!或者,更好的是,尝试将其集成!

迁移压缩器将几个迁移组合成单个最终迁移,该迁移反映了所有迁移运行后的数据库模式。

请注意,squasher是为测试而制作的,不是用于增量数据库更改。使用squasher将删除您的代码中的任何非迁移相关功能。目标是消除所有修改列,以启用sqlite测试。

表压缩器可以处理简单的迁移语句,以正常方式编写,而不是疯狂的方式。例如

Schema::create('my_table', function (Blueprint $table) {
    $table->integer("my_int",10)->unsigned()->unique();
    $table->increments("id");
    $table->string("test",255);
    $table->myEnum("oldArrayInit", array("val1","val2"));
    $table->myEnum("newArrayInit", ["val1","val2"]);

    DB::update('ALTER TABLE `my_table` MODIFY COLUMN `test` blob(500);');
    //etc;
});

这也适用于删除和修改模式。有关它可以处理的内容的更详细视图,请查看src/tests/data/MigrationTestData.php中的示例测试数据。

表压缩器将无法处理如下内容:

$myStringColumns = ["col1","col2","col3"];
foreach($myStringColumns as $column){
    $table->string($column);
}

并且永远不会。迁移不应该以这种方式编写,用PHP编写PHP解析器也不是一项小任务。

以下是如何使用它进行测试的方法

在设置测试用例时,我们运行

recursiveDelete(base_path('app/tests/migrations'));
$squash = new \Cytracom\Squasher\MigrationSquasher("app/database/migrations", "app/tests/migrations");
$squash->squash();
\Artisan::call('migrate', ['--path' => 'app/tests/migrations']);

/**
 * Delete a file or recursively delete a directory
 *
 * @param string $str Path to file or directory
 * @return bool
 */
function recursiveDelete($str){
    if(is_file($str)){
        return @unlink($str);
    }
    elseif(is_dir($str)){
        $scan = glob(rtrim($str,'/').'/*');
        foreach($scan as $index=>$path){
            recursiveDelete($path);
        }
        return @rmdir($str);
    }
}

我们在压缩之前删除所有迁移,以删除可能存在的旧压缩迁移。

再次,如果您发现任何问题,请提出问题,并随时提交审查请求!我们的目标是使使用sqlite进行测试的可能性更大,以实现快速测试。社区的帮助总是受欢迎的。