It’s the end of 2021, and we can finally port our development environments. You might be thinking, “just use docker” right? That’s part of the solution, but the missing piece for a while has been a way to run the development environment directly along-side the application so that you can have a seamless experience when debugging.
I want to be able to develop on Linux, Mac, or Windows, so I’ll need a workflow that works for all of those.
The project im testing this with I started development on my Linux machine about a year ago.
- PHP 7.4
- Symfony 5
- NPM & Webpack Dev Server
In order to support another developer I switched the project over to Homestead. I chose Homestead over Docker containers mainly because Homestead comes pre-baked with all the dependencies I need, and it was easy to set up.
The only interesting part of the Homestead.yaml is the
folders section which I optimized for filesystem performance reasons. I’m only allowing syncing of files which I intend to commit since all other operations will happen within the VM.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 folders: - map: ./ to: /home/vagrant/code type: "rsync" options: :type: "rsync" :rsync__exclude: [ ".git/", "vendor/", "node_modules/", "var/", "public/build/", "public/uploads/" ]
Running the Development Environment
First we run vagrant like normal.
Then we set up the IDE. This is a little different from what we’re used to in PHPStorm.
⚠ When I first started running this I had to increase the resources available. A minimum of 4G is recommended for memory. I increased my Homestead.yaml to have
cpus: 4which works well for my application.
Once started we can use the IDE pretty much like normal except it’s running INSIDE the VM. This means everything we see is “local” to the VM where the IDE is also running. The editor you see is just a dumb pane of glass.
Some advantages come from this. The most obvious is that the PHP interpreter is local, so you don’t have to create a new tunnel when debugging. This makes everything a little faster. The other obvious advantage I’ve found is that dependencies are “real”. What I mean by this is the files you see in the IDE are the ones being used by the project, and they don’t have to be synchronized to the host machine. This results in more accurate and more performant analysis by the IDE since there’s no file synchronization needed for large directories like the node_modules and vendor folders. It also prevents weird behavior between Vagrant host machines. For instance, the node_modules folder often causes bugs on Windows machines due to directory depth. That’s no longer a potential problem.
This feature is still in “Beta” but I’m really liking what im seeing here. So far it feels really polished and solves a huge gap in functionality for the fullstack multi-platform development that I like to do. The thing I like most about this particular solution is that it all can run locally. Sure, you can also connect it to a cloud provider, but I like having the option to run everything without an internet connection.