2012-10-19 18 views
9

Próbuję stworzyć sposób, w jaki hermetyczne kompilacje można osiągnąć, nadal opierając się na zależnościach SNAPSHOT w projekcie.Tworzenie Hermetic Maven Buduje

Dla celów przykładu, że mam projekt, który ma strukturę zależności takiego:

   ┌ other-1.2-SNAPSHOT 
mine-1.2.3 ──┤ 
      └ thing-3.1-SNAPSHOT ── gizmo-6.1.3-SNAPSHOT 

Co chciałbym zrobić, to rozwiązać wszystkie zależności SNAPSHOT lokalnie do czegoś, co jest związane z moją bieżąca wersja, a następnie wdrażaj je jako wersje do repozytorium wydań mojego Nexusa. Nie wszystkie z tych zależności są wewnętrzne, więc nie mogę po prostu wydać na nich wszystkich.

W tym przykładzie other-1.2-SNAPSHOT stanie się czymś takim, jak other-1.2-mine-1.2.3, a thing-3.1-SNAPSHOT stanie się thing-3.1-mine-1.2.3. Jest to względnie banalne w około 60 liniach pythona.

Problem polega jednak na rozwiązywaniu przechodniów SNAPSHOT w konkretnych wersjach. Muszę więc również przekonwertować gizmo-6.1.3-SNAPSHOT na gizmo-6.1.3-mine.1.2.3 i mieć na nim zależność thing-3.1-mine-1.2.3.

To tylko przykład jednego ze sposobów osiągnięcia tego, co chcę. Celem jest to, że za rok lub dwa w dół drogi mogę sprawdzić moją gałąź wydania dla wersji 1.2.3 i być w stanie uruchomić mvn clean package lub coś podobnego bez obawy o rozwiązanie od dawna nieistniejących zależności SNAPSHOT.

Ważne jest, aby ta gałąź była kompilowalna, a nie tylko zachowywać wszystkie zależności przy użyciu funkcji takiej jak jar-and-dependencies funkcjonalności wtyczki zespołu. Chciałbym potencjalnie móc modyfikować pliki źródłowe i tworzyć kolejną wersję wydania (np. Zastosować poprawkę).

Więc

  • Czy istnieje coś takiego, że dostępny będzie w stanie przerobić zależności zrzutu rekurencyjnej modą być beton?
  • Czy są jakieś wtyczki, które zarządzają takimi rzeczami? Wtyczka wydania miała obietnicę z niektórymi opcjami konfiguracyjnymi na jej celu: branch, ale nie rozwiązuje zewnętrznych zależności do tego, czego chcę.
  • Czy są dostępne inne techniki tworzenia hermetycznych buildów Maven?
+3

Brzmi jak anty Maven włamać się do mnie. W Maven jedną z podstawowych zasad jest ** Konwencja nad konfiguracją **. Jeśli zależności są tworzone samodzielnie, należy samodzielnie zarządzać/używać wersji SNAPSHOT/RELEASE. Jeśli pochodzą z innego miejsca, zawsze powinieneś używać najnowszej wersji (nie wersji SNAPSHOT). Spójrz ponownie w [Maven The Complete Reference - sekcja 3.3.1] (http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-pom-syntax.html#pom-reationships -sect-versions) i zobacz, dlaczego SNAPSHOT jest używany w Maven. – yorkw

+0

Bardzo dokładnie rozumiem podstawy Mavena. Jednak żyję w realnym świecie z terminami i bibliotekami stron trzecich, które są niezwykle użyteczne, a mimo to siedzą w wersjach SNAPSHOT przez dłuższy czas. Jason Van Zyl, ktoś, kogo możesz znać, przyznaje nawet, że system o dużym obciążeniu procesowym wokół wydania był wielkim błędem (i zmienia się wraz z teslą). Bez utrzymywania wewnętrznych widelców całego projektu, który konsumujemy, to co robię jest w rzeczywistości skokowo lepszy niż większość ludzi. –

+1

nawet w świecie rzeczywistym należy wziąć pod uwagę pewien powód. Walczysz tutaj z systemem. Jak już wspomniałeś Migawki nie żyją wystarczająco długo - nawet jeśli używasz znaczników czasu, aby polegać na rozdzielczości artefaktów. Moje podejście polegałoby na używaniu zależności i wdrażaniu wtyczek w celu pobrania wszystkich artefaktów i wdrożenia znanych zależności migawki do własnego repozytorium maven poprzez użycie skryptu lub wtyczki self-made-maven. Pomóc może też rozmowa z innymi gadżetami: jeśli mogą wypuszczać wersję beta swoich artefaktów, możesz polegać na tych, którzy nie mają zbyt wiele problemów. – wemu

Odpowiedz

2

To nie jest powszechnie stosowaną techniką, ale zawsze można sprawdzić swoje specyficzne zależności SNAPSHOT do projektu jako „projekt” repozytorium, jak opisano w tym blogu: Maven is to Ant as a Nail Gun is to a Hammer

w skrócie, użyj Zależności Plugin utworzyć repozytorium znajdujące się w katalogu projektu. Poniżej jest kopiowany ze stanowiska związane blogu (który należy czytać):

1) Uruchom mvn -Dmdep.useRepositoryLayout=true -Dmdep.copyPom=true dependency:copy-dependencies

„Stwarza/target/zależnościami z układem repo-jak wszystkich swoich projektów zależnościami”

2) Skopiuj target/dependencies/ coś jak libs/

3) Dodaj deklarację repozytorium jak poniżej do POM:

<repositories> 
    <repository> 
    <releases /> 
    <id>snapshots-I-need-forever</id> 
    <name>snapshots-I-need-forever</name> 
    <url>file:///${basedir}/libs</url> 
    </repository> 
</repositories> 

dokonać tego zautomatyzowany częścią procesu build/release: krok 1 konfigurując wtyczki Zależności do phasephase cyklem życia, a etap 2 stosując AntRun Plugin przenieść pobrane zależności właściwym miejscu ..

nadzieję, że ten działa dla ciebie. Muszę teraz wziąć prysznic ...

+0

Nie zrobiłem tego dokładnie, ale przyszli podróżni prawdopodobnie będą chcieli tego rozwiązania. Stworzyłem specjalne repozytorium nexus i wprowadziłem w nim niestandardowe wersje, a następnie zaktualizowałem pom za pomocą skryptu, podobnie jak opisałem w oryginalnym poście. Użyłem tej techniki w mojej ostatniej pracy i zadziałało to doskonale na podobny przypadek. –

2

Wtyczka maven versions wykona większość tego, co chcesz.

http://mojo.codehaus.org/versions-maven-plugin/

jednak będzie niemal certianly trzeba uruchomić go na etapie pre-build w którym rozwiązania wszystkich zależności i zaktualizować plik pom odpowiednio. Następnie ponownie uruchom maven (który ponownie czyta pom), aby uruchomić prawdziwą kompilację. Możesz być w stanie skonfigurować wszystko w obrębie samej pom uruchomionej z osobnym celem, unikając w ten sposób oddzielnego skryptu.

Działa to lepiej, jeśli używasz określonych wersji zamiast zależności SNAPSHOT i jeśli to konieczne, przejdź do etapu wstępnej kompilacji. Jedyną istotną różnicą w rozwiązywaniu zależności jest to, że maven będzie zawsze pobierać ponownie - zależności SNAPSHOT, podczas gdy pobiera normalne zależności tylko wtedy, gdy dostępna jest nowa wersja. Jednak wiele wtyczek (w tym plugin wersji) traktuje zależności -SNAPSHOT inaczej powodując problemy.Ponieważ każda kompilacja CI ma nowy numer wersji, nigdy nie używam -SNAPSHOT, preferuję inny znacznik, taki jak -DEV, z bardziej przewidywalnym zachowaniem dla takich rzeczy, jak lokalne kompilacje deweloperskie, itp.

Spędziłem dużo czasu, robiąc maven do zrobienia rzeczy podobne do tego. Większość znanych mi projektów ma jakiś etap wstępnej kompilacji w celu ustawienia numerów wersji lub obejścia innych ograniczeń, takich jak ten. Próba zrobienia tego wszystkiego w jednym kroku zwykle kończy się niepowodzeniem, ponieważ maven czyta tylko pom raz, podstawienie sznurkiem nie działa w kilku miejscach, a rozmieszczona/zainstalowana pom nie generalnie nie zawiera wyników zamiany ciągów lub wprowadzonych zmian podczas kompilacji.

Powiązane problemy