如何在Laravel包中自动运行迁移?

时间:2013-05-29 15:37:48

标签: laravel laravel-4

我刚刚在Laravel 4应用程序中安装了Cartalyst的Sentry 2,但我发现我必须通过指定--package=cartalyst/sentry来单独运行该程序包的迁移,这使得无法进行自动部署。

有没有办法运行php artisan migrate并让它运行Sentry的迁移?

4 个答案:

答案 0 :(得分:1)

我在这样的场景中通常做的是通过以下命令发布包迁移:

php artisan migrate:publish vendor/package

这会将迁移文件从任何给定的包复制到迁移文件夹。

答案 1 :(得分:1)

我创建了一个 composer 脚本来替换php artisan migrate .....。该脚本一次运行我的迁移和供应商的迁移。

我的作曲家脚本是

"scripts": {
    "migrate": [
        "php artisan migrate --env=$LARAVEL_ENV",
        "php artisan migrate --package=\"cartalyst/sentry\" --env=$LARAVEL_ENV",
        "php artisan migrate --package=\"mrjuliuss/syntara\" --env=$LARAVEL_ENV",
        "php artisan migrate --package=\"filmoteca/static-pages\" --env=$LARAVEL_ENV"
    ]
}

然后,您可以使用LARAVEL_ENV=prod composer run-script migrate

运行迁移

要将参数传递给脚本,我使用环境变量。在前面的示例中,我将环境变量LARAVEL_ENV设置为prod,以便迁移使用生产数据库连接。

您始终可以在本地计算机中创建别名以缩短命令。例如alias migrate="LARAVEL_ENV=local composer run-script migrate"

我认为这种方法很好,因为当您要向composer.json添加新软件包并且此软件包具有迁移时,您可以在同一文件中添加软件包和软件包的迁移。所以,你不要忘记添加/删除包的迁移。

这是一个包含脚本

的完整composer.json

答案 2 :(得分:0)

在Laravel 5之后,有一种更好的方法可以解决此问题:

在软件包的中创建迁移      / database / migrations文件夹 。 之后,在程序包的服务提供商中创建一个引导方法,引用迁移文件夹

public function boot()
{
    $this->loadMigrationsFrom(__DIR__ . 
    '/database/migrations');
}

现在,在顶层文件夹(主应用程序,需要此软件包)上,您可以运行默认的migration命令,它将通过loadMigrationsFrom方法自动找到软件包的迁移

从以下地址复制答案: http://voerro.com/en/tutorials/r/developing-and-distributing-laravel-5-packages/3

答案 3 :(得分:0)

第三方程序包必须声明一个服务提供者,该服务提供者声明迁移。

如您在https://github.com/laravel/passport/blob/9.x/src/PassportServiceProvider.php#L80所见:

protected function registerMigrations()
    {
        if (Passport::$runsMigrations && ! config('passport.client_uuids')) {
            return $this->loadMigrationsFrom(__DIR__.'/../database/migrations');
        }
    }