2010-03-09 13 views
7

Poszukuje się kilku najlepszych praktyk dotyczących obsługi aktualizacji głównych zależności w projekcie, zakładając użycie narzędzia do zarządzania zależnościami (np. Maven 2).Jak radzić sobie z większymi aktualizacjami framework/dependency?

Konkretnie, jestem zainteresowany:

  • Jak uzyskać odziedziczone aplikację up-to-date (np Wiosna 1.2.x do 2.5.x)
  • Co praktyki mogą być wprowadzane do miejsce po takim przeglądzie, aby zachować aktualność aplikacji

Twoje własne doświadczenia lub artykuły/dokumenty, które spotkałeś/znalazłeś przydatne, są mile widziane.

EDYCJA: Aktualizacja numeru wersji zależności jest banalna. Bardziej szukam sposobów radzenia sobie ze zmianami, które należy wprowadzić, w oparciu o zmiany zależności (wycofanie, usunięcie, zmiany typów w parametrach/wartości zwracanych, itp.). A jeśli istnieje dobry sposób na złagodzenie tych zmian w przyszłości, to utrzymywanie aktualnych zależności powinno być w stanie pozwolić Ci być na bieżąco ze zmianami i zapobiegać marnowaniu czasu, aby uzyskać więcej bezpiecznych funkcji x 2.1 ".

Odpowiedz

1

Z mojego doświadczenia wynika, że ​​aktualizacje zależności są implementowane ze względu na wymaganą funkcjonalność posiadaną przez zależność, jako poprawkę do błędu w zależności, który bezpośrednio wpływa na twój własny kod, obsługę nowej wersji Java lub zachowanie kodu zgodne z określonym standardem (w odniesieniu do zależności wpływających na bezpieczeństwo). Jeśli Twój kod nie należy do żadnej z tych dziedzin, nie będę musiał ich aktualizować, ale zamiast tego zaktualizować je tylko wtedy, gdy będzie to konieczne, ponieważ aktualizacja z wersji do wydania może rzeczywiście wprowadzić błędy do twojej aplikacji.

Zawsze uważałem, że najlepsza praktyka zaczyna się od ukończenia produkcji w aplikacji do cyklu, wydania go jako stabilnej kompilacji i ręcznego aktualizowania zależności w kolejnej iteracji programistycznej. Scentralizowanie wersji w macierzystym POM spowoduje minimalną modyfikację wersji zależności i większą rozszerzalność. Zakładając, że używasz Mavena:

<dependency> 
    <groupId>your.dep.group</groupId> 
    <artifactId>your-artifact-id</artifactId> 
    <version>${desiredVersion}</version> 
</dependency> 
+0

Rozumiem, co mówisz, ale zastanawiasz się nad tym pytaniem. Całkowicie. Przy założeniu, że znajdujesz się w jednej z tych sytuacji, jakie są najlepsze praktyki (Czy wszyscy po prostu pozwolili Eclipse (i być może m2eclipse) poinformować, gdzie klasy już nie istnieją, stały się przestarzałe, itd ... i przejść od tego?) W kierunku drugiej części mojego pytania, utrzymywanie twoich zależności nieco może pomóc w przyszłym uaktualnieniu z powodów, które wymieniasz łatwiej (lub niepotrzebne, jeśli już przeszedłeś do wersji z funkcją "Securer X 2.0" i złagodziłeś wszelkie zakłócenia). –

+0

Próbuję powiedzieć o najlepszej praktyce: zaktualizuj swoje zależności tylko wtedy, gdy okaże się, że wersje zależności, których używasz, nie są ich przecinaniem. Pozwól swojemu IDE powiedzieć, kiedy coś jest przestarzałe lub już nie istnieje, po to jest. Nie jestem przekonany, że bycie na bieżąco zapobiegnie szeroko zakrojonym zmianom kodu w przyszłości. To zakłada znajomość rozwoju twoich zależności. Wszystko, co możesz zrobić, to testować, testować, testować i minimalizować zależności od twoich zależności. – Joel

1

Dobre praktyki dotyczące obsługi zmian zależności są takie same, jak dobre praktyki w zakresie projektowania aplikacji. Chcesz podzielić architekturę i zminimalizować powszechne powiązanie kodu w zależności od zależności, aby zmiany pozostały odizolowane, tak aby aktualizacja zależności nie przerwała każdej części aplikacji. Koduj interfejsy i zachowaj logikę biznesową od kodu infrastruktury.

W przypadku niewielkich ulepszeń (aktualizowanie wydania punktowego zależności) pomocne jest posiadanie kompleksowego zestawu testów jednostkowych w celu wykrywania awarii spowodowanych zmianami interfejsu API. Jest to jeden ważny powód, dla którego czasami pomaga pisać trywialne testy, które wydają się na powierzchni, aby zawsze działały. Przykładem tego jest napisanie prostego testu jednostki JDBC w celu wykonania prostego zapytania. Wydaje się, że to strata wysiłku, dopóki nie złapiecie problemu ze sterownikiem JDBC po aktualizacji bazy danych (stało się to dla mnie).

W przypadku większych zmian (takich jak uaktualnienie niekompatybilnych wersji frameworka, np. Spring), pomocne są niektóre zautomatyzowane testy funkcjonalne lub integracyjne lub przynajmniej specyfikacja funkcjonalna, którą mogą przeprowadzić użytkownicy kontroli jakości w celu zweryfikowania wysokiego poziomu funkcjonalność. Testy jednostkowe najprawdopodobniej nie będą już istotne, jeśli aktualizowany interfejs API interfejsu jest na tyle inny, aby wymagał szerokich zmian kodu.

Faktyczna część taktyczna zarządzania migracją z jednej wersji zależności do innej niekompatybilnej naprawdę zależy od tego, co robisz. Dojrzała biblioteka zapewni pewną ścieżkę migracji i, miejmy nadzieję, nie będzie wymagać od Ciebie przepisywania wszystkiego. Dobrym pomysłem jest oddzielenie zmian kodu związanych ze zmianą struktury od zmian związanych z implementacją nowej funkcji. W ten sposób, jeśli coś się zepsuje, będziesz wiedział, że ma to związek z aktualizacją ram, a nie z czymś, co złamałeś podczas implementowania nowej funkcji.

Częścią tego, co sprawia, że ​​jest to tak trudne, jest to, że w środowisku wykonawczym możesz mieć tylko jedną wersję konkretnej zależności w maszynie JVM, więc musisz zaktualizować cały kod naraz. OSGi rozwiązuje ten konkretny problem, umożliwiając różnym pakietom OSGi działającym w tym samym systemie zależność od różnych wersji zależności, więc możesz polegać na różnych wersjach zależności w środowisku wykonawczym. W ten sposób Eclipse zarządza zależnościami dla wtyczek bez łamania innych wtyczek.

Powiązane problemy