Wie du Meteor auf Windows mit Hilfe von Vagrant zum Laufen bekommst

Ich habe mich nach zahlreichen Problemen mit Meteor und insbesondere mit node-gyp auf Windows nun dazu entschieden Meteor in eine VM auszulagern. Es gibt verschiedene Möglichkeiten dieses Setup zu realisieren. Die meiner Meinung nach beste Möglichkeit möchte ich dir hier vorstellen:

Da du bei Vagrant wegen des Einbindens des Filesystems die Meteor-interne Mongo-DB nicht nutzen kannst, musst du auf eine alternative MongoDB ausweichen. In meinem Setup habe ich mich dazu entschieden die Datenbank auf dem Host-PC zu belassen. So kann sie auch nach einem vagrant destroy weiterhin genutzt werden. In einigen Tutorials wird auch die Möglichkeit beschrieben, mit Hilfe eines Symlinks die Datenbank innerhalb der VM zu belassen und an eine andere Stelle zu verschieben. Diesen Weg finde ich allerdings nicht so elegant.

Installieren der nötigen Software

  1. VirtualBox herunterladen und installieren
  2. Vagrant herunterladen und installieren
  3. MongoDB herunterladen und installieren

Du solltest zunächst sicherstellen, dass die Mongo- und Vagrant-Binaries in deinem Path verfügbar sind.

Setup der Entwicklungsumgebung

Erstelle zunächst mit meteor create ein neues Meteor Projekt und wechsle in das neue Verzeichnis. Alternativ kannst du auch das Verzeichnis eines vorhandenen Projektes öffnen.

Erstelle dann eine neue Datei mit dem Namen app.cmd und lege diese direkt im Projektverzeichnis ab. Diese Datei wird dir helfen alle Abhängigkeiten für deine Entwicklungsumgebung automatisch zu starten. Wenn du dich für die Details interessierst kannst du dir die Kommentare in der Datei durchlesen. Öffne die Datei und kopiere den folgenden Inhalt hinein:

@echo off

title my project

echo Starting meteor app...

REM Run as admin because of symlinks linking to the host filesystem
echo Dont forget to run this as
echo "              _           _       "
echo "     /\      | |         (_)      "
echo "    /  \   __| |_ __ ___  _ _ __  "
echo "   / /\ \ / _` | '_ ` _ \| | '_ \ "
echo "  / ____ \ (_| | | | | | | | | | |"
echo " /_/    \_\__,_|_| |_| |_|_|_| |_|"

echo Starting mongodb server with custom database path...

start mongod --dbpath %~dp0data --port 3300

echo Enabling symlinks in windows...

fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1

echo Starting vagrant...

vagrant up

echo Logging in...

vagrant ssh

Erstelle dann in deinem Projektordner ein Vagrantfile mit dem folgenden Inhalt:

Vagrant.configure("2") do |config|
 
  config.vm.box = "precise32"

  config.vm.box_url = "http://files.vagrantup.com/precise32.box"

  #Use the following provision script
  config.vm.provision :shell, :path => "vagrant-meteor-provision.sh"
  
  #Forward all the traffic from the meteor app to the local port 3000
  config.vm.network :forwarded_port, guest: 3000, host: 3000

  config.vm.provider "virtualbox" do |vb|
      
      #This is important! Enable symlinks for the vagrant share!
      vb.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/vagrant", "1"]
      
      # Display the VirtualBox GUI when booting the machine
      vb.gui = false
      # Customize the amount of memory on the VM:
      vb.memory = "2048"

  end

end

Nun folgt noch das Provisionierungs-Skript:

#!/bin/bash

sudo apt-get update

#Install some meteor dependencys
echo installing dependencys...
sudo apt-get install -y python-software-properties
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
echo "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen" | sudo tee -a /etc/apt/sources.list.d/10gen.list
sudo apt-get update
sudo apt-get install -y git mongodb-10gen curl
cd /usr/local
wget http://nodejs.org/dist/v6.11.1/node-v6.11.1-linux-x86.tar.gz
sudo tar -xvzf node-v6.11.1-linux-x86.tar.gz --strip=1
rm -f node-v6.11.1-linux-x86.tar.gz

#Needed for node-gyp:
apt-get install -y make
apt-get install -y build-essential
apt-get install -y g++

echo installing meteor...
curl https://install.meteor.com | sudo sh

#cd to /vagrant on ssh
echo "cd /vagrant" >> /home/vagrant/.bashrc

#set env on ssh
echo "export MONGO_URL=mongodb://10.0.2.2:3001/meteor" >> /home/vagrant/.bashrc

#run meteor on ssh
echo "meteor" >> /home/vagrant/.bashrc

Zuletzt erstellst du noch den Ordner /data in deinem Projektverzeichnis. Das ist der Ort an dem die Datenbank in Zukunft zuhause ist. Du kannst dieses Verzeichnis in Git ignorieren. Alternativ kannst du das Verzeichnis auch ganz woanders anlegen. Ändere dazu einfach die entsprechende Zeile in der app.cmd.

Die App starten

Alles, was zu tun bleibt ist, die App mittels app.cmd zu starten. Vergiss nicht diese Datei als Administrator auszuführen. Nur so kannst du Windows erlauben auch Symlinks zu nutzen. Daraufhin startet ein lokaler Mongo-Demon auf dem Port 3001. Außerdem wird mit Vagrant die virtuelle Maschine gestartet und installiert. Das kann beim ersten mal eine Weile dauern. Ist die Installation abgeschlossen wirst du automatisch per vagrant ssh eingeloggt und Meteor wird gestartet.

Mögliche Fehler

Wenn du beim Ausführen von Meteor in der Vagrant-Session auf Symlink-Fehler stoßen solltest kann das folgende Ursachen haben:

  1. Du hast die app.cmd nicht als Administrator ausgeführt
  2. Symlinks sind im Vagrantfile für den entsprechenden Share nicht eingerichtet