Vagrant双向文件夹同步

4
我已经设置了一个Vagrant box来运行我的Web服务器以托管我的Symfony2应用程序。除了文件夹同步外,一切都正常。
我尝试了两种方法:
1. config.vm.synced_folder LOCALFOLDER, HOSTFOLDER 2. config.vm.synced_folder LOCALFOLDER, HOSTFOLDER, type="rsync"
选项1: 第一种选项可以工作,但我实际上不知道文件是如何共享的。文件在双向复制,但应用程序非常慢。Symfony正在生成缓存文件,这可能是问题所在,但我不知道如何进行故障排除并查看发生了什么。
选项2: 同步只在单向进行(从本地机器到vagrant box),这覆盖了大多数情况并且速度很快。问题是,当我在vagrant box上使用Symfony命令行生成一些文件时,它们没有被复制到我的本地机器上。
我的问题是: 如何最好地进行双向同步?对于选项1,我如何排除某些文件不进行同步(因为这可能是问题所在)?对于选项2,我如何确保远程更改被复制到我的本地机器上?
3个回答

5
如果默认同步文件夹策略(我想是VirtualBox共享文件夹)对你的使用情况来说速度较慢,你可以选择不同的策略,并且如果需要,可以保持双向同步:
  • 如果你的主机操作系统是LinuxMac OS X,你可以选择NFS
  • 如果你的主机操作系统是Windows,你可以选择SMB

Rsync非常快速,但正如你指出的那样,只能单向同步。


你说的没错,但在我的情况下速度是必须的,NFS 和 SMB 都不符合我的需求... - LEM01
@Emyl,你有使用NFS和SMB的经验吗?在同步速度方面,SMB与NFS相比如何? - Ibn Saeed

3

由于 Vagrant 似乎没有提供“内置”方法来实现此操作,因此我做了以下几步:

  • 在包含应用程序生成文件的文件夹上配置 Vagrant RSYNC 文件夹(在 Symfony2 中,这是您的 Bundle/Entity 文件夹)。请注意,我没有同步根文件夹,因为有些文件夹不需要进行 rsync(如缓存/日志...),而且当我知道只会生成 Entity 文件夹时,rsync 进程解析所有文件夹/子文件夹需要耗费过多时间。由于 Rsync 必须从 Vagrant 箱传输到主机,因此我使用 vagrant-rsync-back 插件,并在每次使用生成代码的命令时手动运行它。 https://github.com/smerrill/vagrant-rsync-back#getting-started

  • 在本地计算机上创建一个监视器,以跟踪代码中的任何更改并将其与 Vagrant 箱进行 rsync 同步。 https://gist.github.com/laurentlemaire/e423b4994c7452cddbd2


Vagrant内置支持NFS和SMB作为双向同步的替代方案。请参见我上面的答案。 - Emyl

-1
Vagrant 将您的项目根目录作为 /vargrant 文件夹挂载到盒子内,实现双向共享。您可以在那里运行命令以获取所需的文件同步。任何 I/O 操作都会非常缓慢(正如您已经提到的),但是您将获得您的文件。对于其他内容,请使用单向同步文件夹。

我的应用程序不放置在那个文件夹中,否则像你提到的那样它会非常慢。而且复制需要移动到那里的文件也需要太多工作,会使其变慢... - LEM01
Vagrant为自己的目的挂载了该文件夹,即使您没有要求它这样做。 - Im0rtality
1
谢谢你的回答,但这仍然使得过程太慢或太复杂(如果我构建另一个脚本来移动新创建的文件,不包括缓存/日志...) - LEM01
1
我个人会在Windows上禁用同步,并依赖IDE的自动上传功能。另外,我仅在容器内运行命令。其中一些命令需要手动从容器中下载文件,但是你可以很好地从容器内查看日志。 - Im0rtality
我同意你的观点,每个任务都必须在虚拟机中完成,否则就会失去使用Vagrant集中管理的优势。但在我的情况下(Symfony框架),代码是通过特定命令生成的,这些生成的类通常需要在生成后进行修改,因此您需要在本地IDE中使用它们。请参见下面是我处理这个问题的方法。 - LEM01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接