如何在Windows主机上的Vagrant中以区分大小写的方式处理文件

时间:2014-10-21 09:56:44

标签: linux windows virtual-machine vagrant virtualbox

在我的Windows 8上,我安装了VirtualBox + Vagrant。我用Laravel Homestead (with Ubuntu)作为框。在此VM或运行命令行上运行站点时,我预计它将在Linux上运行,而不是在Windows上运行。但我发现了一些奇怪的问题:

首先是我的文件夹映射:

folders:
    - map: D:\DaneAplikacji\easyphp\data\localweb\projects\testprovag\strony
      to: /home/vagrant/code

sites:
    - map: learn.app
      to: /home/vagrant/code/my-first-app/public

当我在浏览器http://learn.app:8000中运行时,我得到了正确的输出 - 来自/home/vagrant/code/my-first-app/public的页面与D:\DaneAplikacji\easyphp\data\localweb\projects\testprovag\strony\my-first-app/public中的代码相同,只是为了清楚。

现在出现问题:

在我的public文件夹中,我创建了2个简单文件:

名称为test的文件(文件为空)和文件index.php包含内容:

<?php 

if (file_exists('TEST')) {
    echo "file exists";
}
else {
    echo "file NOT exists";
}

现在我在浏览器中运行http://learn.app:8000,然后输出file exists。这是我不能期待的结果。据我所知,在Linux(我的盒子是Ubuntu)中你可能有不同名称的文件(与Windows相反),所以我希望得到file NOT exists

我已经在运行php index.php的虚拟机中对其进行了测试,我得到完全相同的结果file exists又出乎意料。

现在我做了什么,我将这两个文件复制到我的VM /home/vagrant/TESTS上的其他目录 - 这个目录没有使用Vagrant进行映射。现在,当我运行php index.php时,我得到了file NOT exists预期结果。

说实话,我完全不了解它。 问题 - 在使用Vagrant映射操作VM文件系统(在本例中为Ubuntu)或Virtual BOX主机文件系统(在我的情况下为Windows)时使用PHP。有没有办法让它能够达到预期的效果?我知道这个问题可能与软件有关,但它真的与PHP和Laravel有关,也许我想念这里。

3 个答案:

答案 0 :(得分:4)

我认为这个问题可以在不使用Samba或太多工作的情况下解决。

在Windows cmd中,我运行:

vagrant plugin install vagrant-winnfsd

它安装了plugin for NFS for Windows,虽然在http://docs.vagrantup.com/v2/synced-folders/nfs.html您可以清楚地知道NFS对Windows不起作用:

  

Windows用户:NFS文件夹在Windows主机上不起作用。 Vagrant将忽略您在Windows上对NFS同步文件夹的请求。

我修改了Homestead.yaml文件映射:

folders:
    - map: D:\DaneAplikacji\easyphp\data\localweb\projects\testprovag\strony
      to: /home/vagrant/code

为:

folders:
    - map: D:\DaneAplikacji\easyphp\data\localweb\projects\testprovag\strony
      to: /home/vagrant/code
      type: "nfs"

(可能如果不使用Homestead.yaml,您可以添加type: nfs,类似config.vm.synced_folder ".", "/vagrant", type: "nfs"中的Vagrantfile

现在我跑

vagrant up

我收到2或3个管理员密码通知(可能是NFS的一些Windows配置 - 它只会在我添加NFS类型后首先运行vagrant up时出现)但现在两者都使用url http://learn.app:8000我来自问题file NOT exists的情况和我在框命令行中运行php index.php时的情况相同。

注意:此解决方案无法让您在同一目录中创建testTEST文件,您将在文件系统中使用它们。它似乎以区分大小写的方式处理文件,因此如果您在应用程序中创建了一个错误的文件(以及稍后在您的代码中要加载它/ require),您会注意到它不会对您的Vagrant起作用Linux盒子(它可以在Windows WAMP上运行,在开始生产时你会感到惊讶)。

答案 1 :(得分:1)

使用默认的vagrant共享,您使用仍由基础文件系统提供的已安装文件夹。它也不会正确处理Linux ACL。

我们发现的一个解决方案是,不是与客户端共享主机的文件夹,而是在guest虚拟机上设置samba并将其共享回主机。它更麻烦,你必须做更多的配置,但至少你的app应该在一个环境中运行

答案 2 :(得分:1)

有趣。我将Windows 7与Homestead一起使用 - 我还假设案例敏感性文件问题将由Vagrant处理。但是我运行了一些类似的测试 - 而且你是对的 - 它实际上是不区分大小写的。

我可以确认这个问题与PHP根本没有关系 - 问题实际上发生在命令行本身的Vagrant中:

touch EXAMPLE
rm example

当我进入SSH时,它会传递给Vagrant框。但是在一个真正的Ubuntu盒子上(我在我的服务器上测试过它) - 该命令失败了。

原因是Vagrant正在调用Windows以检查映射文件夹的文件是否存在。但是如果你在Vagrant中创建一个虚拟的非映射文件夹 - 那么就打电话给&#39;查看文件是否存在仍然在Vagrant内部,因此只能由Ubuntu处理 - 这就是你的其他测试通过的原因。

我尝试将Windows 7的案例敏感度打开为documented here - 但它没有解决问题