8

To, co zaczęło się jako niewielkie rozdrażnienie, zmieniło się teraz w ból głowy. Buduję aplikację Rails 4 i używam Foremana do konfiguracji dev z plikami Procfile i .env do konfiguracji. Po ustawieniu zmiennej ENV w pliku .env jest ona poprawnie pobierana przez moją aplikację. W tym przypadku ustawiam niektóre opcje ENV dla Paperclip w inicjalizatorze.Dlaczego moje inicjatory Rails buforują zmienne ENV w konsoli (Foreman, Dev env)

Problem pojawia się, gdy idę, aby zmienić wartość zmiennych ENV. W konsoli, jeśli wpiszę ENV ["MY_VAR"], pokazuje nową wartość. Jednak wartość użyta w moim inicjalizatorze, która prawdopodobnie została uruchomiona po uruchomieniu konsoli, pokazuje starą wartość! W moim projekcie nigdzie nie ma starej wartości. To prowadzi mnie do przekonania, że ​​środowisko jest w jakiś sposób buforowane lub że zmienne env są eksportowane do mojej powłoki. Kończy mi się miejsc, aby wyglądać, więc każda pomoc będzie bardzo doceniona! Pracuję na komputerze Mac (10.9.4) z Ruby 1.9.3-p374 i Rails 4.1.0.

przykład:

korzenie/.env

S3_BUCKET=mybucket 

konfiguracji/inicjalizatory/paperclip.rb

Paperclip::Attachment.default_options[:s3_credentials] = {bucket: ENV["S3_BUCKET"]} 

Jeśli zmienić wartość S3_BUCKET do "newbucket" i uruchom „nadzorca uruchom konsole c "lub" szyny c ", aby wejść do konsoli, tak się dzieje:

ENV["S3_BUCKET"] # => "newbucket" 
Paperclip::Attachment.default_options[:s3_credentials] # => {bucket: 'mybucket'} 

Należy wspomnieć, że to zachowanie występuje również w moich klasach, które wprowadziłem/lib. Wyobrażam sobie, że to wszystko z powodu czegoś głupiego, którego przeoczyłem. Jakieś pomysły?

+0

Jeśli zmienisz swoje env vars i chcesz, aby aplikacja je odebrała, musisz ponownie uruchomić aplikację. Tak było zawsze. – nzifnab

+0

Tak, oczywiście. Jednak, aby wyjaśnić, PO ponownym uruchomieniu aplikacji, zmiany nie są odbierane w inicjalizatorów, ale są one pobierane w hash ENV. – Spencer

+0

Czy używasz 'spring' przez przypadek? (Sprawdź swoją Gemfile.) – fny

Odpowiedz

24

Jeśli używasz Rails 4 po wyjęciu z pudełka, chodzi o klejnot zwany Spring który jest przeznaczone aby ułatwić Ci życie przez wstępne ładowanie instancję aplikacji w tle i przeładowywania go jako swojego kodu i konfiguracji zmiany plików.

Spring monitoruje jednak tylko domyślne pliki konfiguracyjne Railsów, więc musisz skonfigurować Spring, aby monitorować dodatkowe pliki, które chcesz przeładować.

Wiosna czyta ~/.spring.rb i config/spring.rb dla ustawień niestandardowych. Możesz dodać dodać następującą linię do pliku w wybranym miejscu, aby obejrzeć plik .env zmian:

Spring.watch '.env' 

Zobacz Spring's configuration documentation w README aby uzyskać więcej informacji.

+0

Świetne, dzięki! Wygląda na to, że powinienem uważniej przeczytać notatki aktualizacji :-). – Spencer

+4

OMFG ... Zastanawiam się, dlaczego restart konsoli nie wykryłby zmian, nawet gdy usunąłem plik flipp'n! Musiałem całkowicie wyłączyć terminal. Dziękuję za to! Absolutnie denerwujące. – manafire

+1

Z tego, co wiem, konfiguracja/inicjalizatory nie są ponownie ładowane nawet z tą poprawką. Zobacz tutaj: https://github.com/rails/spring/issues/378 – stevo