/ virtualbox

如果你用了 Homestead 并且升级到 macOS High Sierra,你可能需要点进来

昨晚我尝试在一个本地项目里执行 php artisan migrate:fresh,结果提示

Base table or view not found: 1146 Table 'orders' doesn't exist (SQL: alter table orders add refund_no varchar(255) null after ship_status)

我确认 migrations 目录下有 create_orders_table 这个文件,并且给 orders 添加字段的 migration 文件的生成时间是晚于 create_orders_table 文件的,检查数据库也发现并没有创建 orders 表,查看 migrations 表里面也没有 create_orders_table 对应的记录,也就是说 Laravel 跳过了这个文件。

于是先把数据库清空,找到 migrate 命令对应的类 Illuminate\Database\Console\Migrations\MigrateCommand,核心逻辑是

$this->migrator->run($this->getMigrationPaths(), [
      'pretend' => $this->option('pretend'),
      'step' => $this->option('step'),
]);

Illuminate\Database\Migrations\Migrator 类中找到 run 方法的代码

public function run($paths = [], array $options = [])
{
    //  其他代码略
    $files = $this->getMigrationFiles($paths);
		//  其他代码略
}

$files = $this->getMigrationFiles($paths); 下面加一行 dump($files);,再次执行 migrate,发现 dump 出来的结果依然没有 create_orders_table。看了一眼 getMigrationFiles 的实现,是通过 glob 函数来获取的,说明从底层返回上来的结果里就没有 create_orders_table 文件,这就很诡异了。

我分别在我的 mac 和虚拟机中的 migrations 目录下执行 ls 命令,发现虚拟机 ls 出来的结果就是没有 create_orders_table 文件,看来这个锅和 Laravel 无关,用相关关键字搜索了一下,发现也有人遇到类似的问题 https://github.com/hashicorp/vagrant/issues/8788 ,基本上断定是升级成 AFS 文件系统导致的,目前苹果官方还没有修复这个问题。

在茫茫多的讨论中,看到了 这个这个 回复,于是尝试修改 Homestead.yml

folders:
    - map: ~/vagrant/homestead
      to: /home/vagrant/code
      type: "nfs"
      options:
            mount_options: [ 'nolock', 'vers=3', 'tcp', 'fsc', 'rw', 'noatime' ]

挂载 nfs 的时候加上 tcp 选项,然后在 mac 执行 vagrant reload --provision,启动完成之后发现问题修复。

如果你用了 Homestead 并且升级到 macOS High Sierra,你可能需要点进来
Share this