cytracom / squasher
将增量Laravel迁移文件聚合为每个表的单一迁移。这消除了所有修改列,使得通过sqlite进行测试成为可能。
Requires
- laravel/framework: 4.0.*
Requires (Dev)
- phpunit/phpunit: 3.7.*
This package is not auto-updated.
Last update: 2024-09-24 01:30:55 UTC
README
将增量Laravel迁移文件聚合为每个表的单一迁移。当需要将大量迁移集合压缩为每个表的单一迁移时,这可能是有益的。
此包还消除了所有修改列,因为所有迁移都聚合到一个文件中,这使得通过sqlite进行测试成为可能。
要安装,只需要求
"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进行测试的可能性更大,以实现快速测试。社区的帮助总是受欢迎的。