Jak edytować GEM, jest to możliwe

Witam,
Czy można edytować zawartość Gemu? Jeżeli tak czy mógłby ktoś powiedzieć, gdzie go mogę znaleźć w strukturze? Wydawało mi się, że powinien być w lib, ale tam go nie ma :frowning:

Drugie pytanie chciałem się zapytać dlaczego skoro korzystam w jednym kontrolerze z polecenia:

<%= @user.username %>

to samo wpisane w kontrolerze drugim (jego plikach html) daje:

undefined method `username' for nil:NilClass
bundle install --path vendor

i w katalogu vendor/ruby/<ruby_version>/gems/

W lib przechowujesz własne dodatkowe moduły, natomiast gemy są w ./vendor.

Ad.2
Ponieważ w drugim kontrolerze nie stworzyłeś obiektu @user

Ale oczywiście nie edytujesz plików tego gema tylko korzystasz z tego, że w ruby klasy są otwarte (open classes) i możesz je modyfikować z zewnątrz.

A jeżeli chcesz dodać coś do projektu gema klonujesz z githuba, nanosisz zmiany i robisz push, musisz poczekać jeszcze na zatwierdzenie zmian.

Porada z --path vendor jest niezbyt dobra, bo jak coś zmienisz w takim gemie, to przy nowej wersji już tych zmian nie będziesz miał.

Możesz spróbować “monkey patchingu”, ale to może się źle skończyć jeżeli nie wiesz do końca co robisz.

Możesz tak jak poleca @Vayneyks w ostatnim poście zmienić gema na githubie i zrobić pull request, być może autorzy gema sami wprowadzą zmiany.

Jeżeli potrzebujesz zmian na teraz, to ja polecam sclonować gema do jakigoś katalogu w aplikacji, np.:

git clone github.com/someone/foo lib/foo

i dodać go do Gemfile:

gem 'foo', :path => "./lib/foo"

Można też skorzystać tymczasowo z własnego forka bezpośrednio z githuba.
W Gemfile wklepać:

gem 'foo', :git => "git@github.com:/yourgitnick/foo.git"

Jak autorzy gema zaadoptują zmiany, wywalamy tylko “, :git => …” z Gemfile i mamy posprzątane.

wow, dzięki wszystkim :smiley:
od razu wszystko stało się o wiele bardziej zrozumiałe

Podłączę się z pytaniem, które chyba pasuje do tego wątku.
Mam sforkowanego gema, którego chcę używać w więcej niz jednym projekcie. Kod sforkowanego gem’a jest jeszcze mało dojrzały więc ulega ciągłym modyfikacjom. Wobec czego rozwiązanie, które podałem wcześniej w wątku (użycie własnego forka w Gemfile), jest w sam raz dla mnie.
Niestety autor gema nie utworzył .gemspec’a. W związku z ‘bundle install’ nie możę znaleźć gema.
Na dodatek autor twierdzi, że jest to feature i nie zamierza tworzyć gemspeca, aż uzna, że gem jest gotowy. Nie bardzo rozumiem takie podejście. Czy ktoś może mi to wytłumaczyć czemu ma to służyć?
Dodatkowe pytanie. W jaki sposób to obejść? Na myśl przychodzi mi utworzenie swojego gemspeca w swoim forku. Ale może jakies lepsze pomysły?

A co to za gem? W swoim forku możesz robić co Ci się podoba, ale weź też pod uwagę, że jeśli stowrzysz coś wartościwego, to jednak fajnie byłoby, żeby to trafiło do głównej wersji gema - wtedy dobrze jest dogadać się z autorem tak, żeby później chętnie przyjął Twoje zmiany.
Może warto zrobić brancha, w którym jedyna zmiana to dodanie gemspeca?

@apohllo
Sporadycznie działam na githubie, ale oczywiście wysyłam pull requesty, zawsze gdy uważam, że coś jest tego warte.
Twój pomysł z osobną gałęzią jest bardzo OK.
Interesuje mnie natomiast dlaczego autor nie che dodać gemspeca. Czy to jakaś powszechna praktyka? Nie rozumiem, co się w ten sposób zyskuje?
Tu jest link do gema https://github.com/blowmage/minitest-rails
A tu jest wypowiedź autora w sprawie braku gemspeca https://github.com/blowmage/minitest-rails/issues/11

Tak sobie pomyślałem, że to zenspider, bo taka sama sytuacja jest z RubyInline. On generuje gemspec-a za pomocą hoe - po prawdzie dla mnie to jest bez sensu bo gemspec jest na tyle prostym plikiem, w którym dodatkowo można robić wywołanie Rubiego np. do ustawienia daty, że generowanie go jest przerostem formy nad treścią. Śmierdzi to mavenem (wszystko definiujemy w jednym uber-extra-wypasionym pliku manifestu i do każdej pierdoły, typu podmian numeru wersji piszemy plugin). Ale cóż z autorem czasem trudno się dyskutuje.

Moim zdaniem to wytłumaczenie jest głupie, wcale nie trzeba wypuszczać gema, mogliby dać version 0.0.0 na githubie i trzymać nie wrzucać tego na rubygems. Ja bym na Twoim miejscu dodał w swoim forku gemspeca i się nie zastanawiał :wink:

Źle go zrozumiałeś - zenspiderowi nie chodzi o to, że wrzucą gemspeca na githuba tylko nową wersję gem-a z gemspec-iem na rubygems.
Więcej w temacie https://github.com/seattlerb/rubyinline/pull/7

On generuje gemspeca w trakcie deploymentu i dlatego nie chce go wrzucać do repozytorium bo to nie jest dry. Tak jak pisałem wyżej - on preferuje podejście mavenowe, gdzie wszystko - poczynając od gemspeca skończywszy na testach jest konfigurowane w jednym pliku + 50 pluginach.

Mówiłem o blowmage, to z hoe rozumiem :slight_smile: