Rails + Windows – to się może udać
💡

Rails + Windows – to się może udać

W środowisku Ruby przyjęło się, że każdy, kto chce programować w Ruby on Rails na Windowsie musi być niezłym hipsterem. Ogólnie da się tak pracować, ale kwestie konfiguracji i instalacji części gemów mogą sprawiać duże problemy.

Docker na ratunek

Docker powstał między innymi dlatego, żeby rozwiązywać takie problemu. Pomaga programistom niezależnie od systemu operacyjnego pracować w dowolnej technologii.

I tak zamiast pchać się w akrobacje z konfiguracją Railsów na Windowsie najłatwiej opakować sobie środowisko w kontenerach. Tak może wyglądać Dockerfile dla kontenera z RoR.

FROM ruby:2.7.2
WORKDIR /api
COPY ./Gemfile /api/Gemfile
COPY ./Gemfile.lock /api/Gemfile.lock

RUN cd /api && bundle install

Teoretycznie to wystarczy, żeby móc pracować z RoR na dowolnym systemie operacyjnym.

AchieveGuru – gdzie nie każdy kocha MacOS

W AchieveGuru opakowaliśmy całe środowisko w Dockerze. Wszysto działało super i development szedł do przodu.

…aż do momentu, kiedy Bogusz, postanowił wrócić do ko[d]rzeni i zacząć programować w projekcie. CEO AchieveGuru jako doświadczony .netowiec pracuje na Windowsie. Po małych perturbacjach z samym Dockerem odpalił u siebie aplikację, ale w momencie, kiedy dodawał kod do API stojącym na Ruby on Rails wyglądało tak, jakby serwer nie reagował i nie wykrywał zmian w kodzie Ruby. Konieczny był restart kontenerów.

Tego problemu nie udało nam się odtworzyć na MacOS, co więcej modyfikacje w kodzie frontendu aplikacji, w ramach React pokazywały się w locie.

FileUpdateChecker

Początkowo szukaliśmy rozwiązania w konfiguracji Dockera i rezygencji z docker-synca, który nie działał na Windowsie. Na szczęście natrafilśmy na pomocny post na StackOverflow.

Wszystkiemu winna była ta linia w development.rb.

config.file_watcher = ActiveSupport::EventedFileUpdateChecker

Po zmianie

file_watcher

na

FileUpdateChecker

wszystko zaczęło działać jak należy i Bogusz może teraz sukcesywnie zakochiwać się w Ruby 😍

config.file_watcher = ActiveSupport::FileUpdateChecker

FILE WATCHER

O co chodzi w tej zmianie i za co odpowiada config.file_watcher i czym się różni EventedFileUpdateChecker od FileUpdateChecker?

FileUpdateChecker

Sprawia, że aplikacja obserwuje pliki i foldery pod kątem zmian, tak śledzone są zmiany np. w config/routes.rb.

EventedFileUpdateChecker

Nasłuchuje na zmiany w systemie plików, nie obserwuje tych zmian na dysku, ale używa specyficznych dla platformy zdarzeń w systemie plików, aby triggerować zmianę w stanie.

Dlaczego FileUpdateChecker

FileUpdateChecker obsługuje nasłuchiwanie na dysku, w związku z tym w aplikacji działającej w Dockerze obserwuje zmiany na volumenach dockera, nie na plikach w ramach systemu operacyjnego.

Windows on Rails

Tak to możliwe 😀

Dzięki Dockerowi fani Microsoftu nie muszą już przesiadać się na Linuxa czy MacOS, żeby programować w Ruby.