我知道我可以運行斌/蛋糕遷移遷移--plugin爲myplugin我如何運行cakephp 3中所有插件的所有遷移?
我卻用50多個插件,在我的項目和ID喜歡用一個命令這是可能的運行所有遷移的所有插件?
我知道我可以運行斌/蛋糕遷移遷移--plugin爲myplugin我如何運行cakephp 3中所有插件的所有遷移?
我卻用50多個插件,在我的項目和ID喜歡用一個命令這是可能的運行所有遷移的所有插件?
據我所知是沒有直轉發所有插件的遷移命令。但是,您可以將一個簡單的Shell腳本放在一起來完成此操作。
您可以檢索使用一個應用程序的所有加載的插件的列表: -
$plugins = Plugin::loaded();
然後,您可以運行使用dispatchShell
每個插件,它允許您運行從另一個shell命令的遷移: -
$this->dispatchShell(
'migrations',
'migrate',
'-p',
$plugin
);
每個參數用於遷移作爲參數傳遞給dispatchShell
傳遞。
因此,把所有的連成一個shell腳本: -
<?php
// src/Shell/InstallShell.php
namespace App\Shell;
use Cake\Console\Shell;
use Cake\Core\Plugin;
class InstallShell extends Shell
{
public function plugins()
{
$plugins = Plugin::loaded();
foreach ($plugins as $plugin) {
$this->dispatchShell(
'migrations',
'migrate',
'-p',
$plugin
);
}
}
}
該腳本將被稱爲像$ bin/cake install plugins
。
我用下面的代碼改進了「drmonkeyninja」答案。這樣,遷移只在以前沒有遷移時才運行,並且按照文件名中給出的時間戳遷移。
<?php
// src/Shell/InstallShell.php
namespace App\Shell;
use Cake\Console\Shell;
use Cake\Core\Plugin;
use Migrations\Migrations;
class InstallShell extends Shell
{
public function plugins()
{
$migrationsClass = new Migrations();
$migrations = [];
$pluginMigrations = [];
$plugins = Plugin::loaded();
foreach ($plugins as $plugin) {
$statuses = $migrationsClass->status(['plugin' => $plugin]);
$path = Plugin::path($plugin) . 'config' . DS . 'Migrations' . DS;
if (@$handle = opendir($path)) {
while (false !== ($entry = readdir($handle))) {
if ($entry != "." && $entry != "..") {
$timestamp = substr($entry, 0, 14);
if(!is_numeric($timestamp)) {
continue;
}
foreach($statuses as $status){
if ($status['status'] == 'up' && $status['id'] === $timestamp) {
continue(2);
}
}
$migrations[] = $timestamp;
$pluginMigrations[$timestamp] = $plugin;
}
}
closedir($handle);
}
}
sort($migrations);
foreach ($migrations as $timestamp) {
$this->dispatchShell(
'migrations',
'migrate',
'-p',
$pluginMigrations[$timestamp],
'-t',
$timestamp
);
}
}
}
只需手動遍歷需要遷移到您的deploy.sh腳本等 – mark