Angular CLI as WSL 2.0 Test Case
I've been fascinated by the existence of Windows Subsystem for Linux (WSL) ever since its introduction. I've played with it occasionally, such as trying to run ROS on it. And this time I thought I'd try installing the Angular CLI on a WSL instance. But this time with a twist: this is now WSL 2.0, a big revamp of the concept. Architecturally, there's now much more of an actual Linux distribution running inside the environment, which promises even better Linux compatibility and performance in Linux-native scenarios. The tradeoff is a reduction in performance of Windows-Linux interoperations, but apparently the team decided it was worthwhile.
But first, I have to run through the installation instructions which, on my 2004 build, encountered the error that required a Linux kernel update.
WSL 2 requires an update to its kernel component. For information please visit https://aka.ms/wsl2kernel
Then I can install it from Microsoft store followed by an installation of Ubuntu. Then I installed Node.JS for Ubuntu followed by Angular CLI tools. The last step ran into the same permissions issue I saw on MacOS X with node-modules ownership. Once I took ownership, I got an entirely new error:
Error: EACCES: permission denied, symlink '../lib/node_modules/@angular/cli/bin/ng' -> '/usr/bin/ng'
The only resolution I found for this was "Run as root". Unsatisfying, and I would be very hesitant if this was a full machine but I'm willing to tolerate it for a small virtual machine.
Once I installed Angular CLI, I cloned by "Tour of Heroes" tutorial repository into this WSL instance and tried ng serve
. This triggered the error:
Cannot find module '@angular-devkit/build-angular/package.json'
Which turned out to be a Node.JS beginner mistake. Looking up the error I found this StackOverflow thread where I learned that cloning the repository was not enough. I also need to run "npm install" in that directory to set up Node dependencies.
Once those issues were resolved, I was able to run the application where I found two oddities. (1) I somehow didn't completely remove the mock HEROES reference on my Mac? And (2) package.json and package-lock.json had lots of changes I did not understand.
But neither of those issues were as important as my hopes for more transparent networking support in WSL 2. Networking code running in WSL was not visible from elsewhere in my local network unless I jumped through some hoops with Windows Firewall, which was what made ROS largely uninteresting earlier for multi-node robots. WSL 2 claimed to have better networking support, but alas my Angular application's "ng serve" was similarly unreachable from another computer on my local network.
Even though this test was a failure, judging by the evolution of WSL to WSL2 I'm hopeful that work will continue to make this more seamless in the future. At the very least I hope I wouldn't have to use the "run as root" last resort.
Until the next experiment!