Submodul, jó? Nem jó?
Miután felmerült a submodule gondolata elbizonytalanodtam benne, hogy nem e rossz megoldás, mert pl mivan ha pont mikor deployozunk aközben volt frissítés submodulunkon és akkor a git submodule update hatására hiba lehet production környezetben. Nos aki ilyenre gondolt az feleslegesen paráztatta magát, mert ugyan itt is felmerült ez a para de egy szép példával megnyugtatnak mindenkit. (Aki hamarabb akarja tudni a választ annak pedig elárulom hogy ha submodult adunk projektünkhöz akkor a legközelebbi commitunkal a submodul kicheckoutolt commitját küldjük el, és a történethez az még hozzátartozik, hogy ha inicializáljuk a projektünket és aztán mondjuk git submodule update --init akkor azt a commitot fogja kicheckoutolni submodul repóból amivel bekerült projektünkbe. )
(másik hasznos leírás submodulról: http://woss.name/2008/04/09/using-git-submodules-to-track-vendorrails/ )
Gem vs submodul
A fentiekben megismert megnyugtató tudás birtokában viszont el lehet gondolkodni a projektünkhöz szükséges gem-ek submodulként való alkalmazásán. Ugyanis ha a rails config-ban nem pontosan adjuk meg a gem dependency-t, azaz version-nek nem adunk meg semmit, vagy épp felgmán :version=>”>=2.1.0″ adunk meg akkor lehet a production szerveren frissítik a gem-et (mert épp vkinek a legújabb változat szükséges) míg te a saját gépeden nem és lehet azzal már nem lesz kompatibilis az alkalmazásod egy új deploy után mikor újraindul szerver. Persze ha pontosan adjuk meg a versiont minden gemünknél akkor nincs ez a probléma. De pozitív a submodulban hogy nem kell nyaggatni a szerver tulajt hogy ugyan tegye már fel ezt meg azt a gem-et, hanem minta ügyfelek lehetünk akikkel sosincs gond.
Capistrano submodulal
Eddig ok. Mit kell tenni hogy ez a valóságban is működjön. Pl capistranonál meg kell adni a következőket
set :git_enable_submodules, 1 ssh_options[:forward_agent] = true
Ezzel engedve van a submodulok automatikus kicheckoutolása minden deploynál. (Ne felejtsük: csak akkor szedi update le a legújabbat ha a projektünkben frissítettük a submodult)
Capistrano beágyazott submodulal
Nade mi van akkor, ha a submodulban submodult használnak?
Amolyan félelem és reszketésesen azt is kérdezhetnénk: Mennyi a majom?? Ehhez felejtsük el amit a fenti bekezdésben írtam és menjünk biztosra:
require 'capistrano/deepmodules'; set :deploy_via, :remote_cache
Ennyi. Ehhez viszont szükséges ez. (leírás itt)
Egyéb:
- ssh kapcsolatnál ne felejtsük el megadni github-nak a production szerveren lévő publikus kulcsunkat is.
- capistrano nem törli a már nem használt submodulokat (leírás, megoldási tip itt)