我刚刚在 Laravel 4 应用程序中安装了 Cartalyst 的 Sentry 2,但我发现我必须通过指定单独运行该包的迁移--package=cartalyst/sentry
,这使得自动部署成为不可能。
有没有办法运行php artisan migrate
并让它运行 Sentry 的迁移?
在这种情况下,我通常会通过以下命令发布包迁移:
php artisan migrate:publish vendor/package
这会将迁移文件从任何给定包复制到您的迁移文件夹。
在 Laravel 5 之后有一个更好的方法来解决这个问题:
在包的 /database/migrations 文件夹中创建您的迁移。之后,在包的服务提供者中创建一个引导方法,引用迁移文件夹
public function boot()
{
$this->loadMigrationsFrom(__DIR__ .
'/database/migrations');
}
现在,在顶级文件夹(需要此包的主应用程序)上,您可以运行默认迁移命令( php artisan migrate ),它会通过 loadMigrationsFrom 方法自动查找包迁移
答案复制自:http: //voerro.com/en/tutorials/r/developing-and-distributing-laravel-5-packages/3
我创建了一个作曲家脚本来替换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
第 3 方包必须声明一个服务提供者,即声明迁移。
正如您在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');
}
}