Odpowiedzi:
Wersja migawki w Maven to taka, która nie została wydana.
Chodzi o to, że przed1.0
uwalnianiu (lub dowolny inny release) jest zrobione, istnieje 1.0-SNAPSHOT
. Ta wersja może się stać 1.0
. Zasadniczo jest „w 1.0
fazie rozwoju”. Może to być zbliżone do prawdziwego 1.0
wydania lub dość daleko ( 0.9
na przykład tuż po wydaniu).
Różnica między wersją „rzeczywistą” a wersją migawkową polega na tym, że migawki mogą otrzymywać aktualizacje. Oznacza to, że pobieranie 1.0-SNAPSHOT
dzisiaj może dać inny plik niż pobieranie go wczoraj lub jutro.
Zwykle zależności migawki powinny istnieć tylko podczas programowania i żadna wydana wersja (tj. Brak wersji innej niż migawka) nie powinna mieć zależności od wersji migawki.
1.0-DEVELOPMENT
” lub polubić „ 1.0-INPROGRESS
”, dlaczego ludzie muszą używać nieoczywistych terminów
Trzy pozostałe odpowiedzi zapewniają dobrą wizję -SNAPSHOT
wersji. Chciałem tylko dodać trochę informacji dotyczących zachowania Maven, gdy znajdzie SNAPSHOT
zależność.
Podczas budowania aplikacji Maven wyszuka zależności w lokalnym repozytorium. Jeśli nie zostanie tam znaleziona stabilna wersja, przeszuka ona zdalne repozytoria (zdefiniowane w settings.xml
lub pom.xml
), aby pobrać tę zależność. Następnie skopiuje go do lokalnego repozytorium, aby udostępnić go dla następnych kompilacji.
Na przykład, foo-1.0.jar
biblioteka jest uważana za wersję stabilną , a jeśli Maven znajdzie ją w lokalnym repozytorium, wykorzysta ją do bieżącej kompilacji.
Teraz, jeśli potrzebujesz foo-1.0-SNAPSHOT.jar
biblioteki, Maven będzie wiedział, że ta wersja nie jest stabilna i może ulec zmianie. Właśnie dlatego Maven spróbuje znaleźć nowszą wersję w zdalnych repozytoriach, nawet jeśli wersja tej biblioteki zostanie znaleziona w lokalnym repozytorium. Jednak ta kontrola jest przeprowadzana tylko raz dziennie. Oznacza to, że jeśli masz foo-1.0-20110506.110000-1.jar
(tj. Ta biblioteka została wygenerowana 2011/05/06 o 11:00:00) w swoim lokalnym repozytorium, a jeśli uruchomisz kompilację Maven ponownie tego samego dnia, Maven nie sprawdzi repozytoriów dla nowszej wersji.
Maven umożliwia zmianę tej zasady aktualizacji w definicji repozytorium:
<repository>
<id>foo-repository</id>
<url>...</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>XXX</updatePolicy>
</snapshots>
</repository>
gdzie XXX
może być:
SNAPSHOT
wersja będzie obsługiwana jako biblioteki stabilne.(model pliku settings.xml można znaleźć tutaj)
SNAPSHOT
wersji: mvn clean package -U
zgodnie z samouczkiem maven
-U
flagą. Może nie działać zgodnie z oczekiwaniami z powodu MNG-4142 .
mvn install
zainstalować słoik wersji 1.0-SNAPSHOT na moim lokalnym repozytorium. Następnego dnia wprowadziłem zmiany w projekcie, ale nie zmieniłem wersji - wtedy, gdy działałem mvn install
, nie wydawało się, że zmienia to w moim lokalnym repozytorium. Czy to oczekiwane zachowanie? Czy nie mogę ponownie użyć wersji i zastąpić ją mvn install
po wprowadzeniu zmian?
Termin „SNAPSHOT” oznacza, że kompilacja jest migawką twojego kodu w danym momencie.
Zazwyczaj oznacza to, że ta wersja jest wciąż intensywnie rozwijana.
Kiedy kod będzie gotowy i nadszedł czas na jego opublikowanie, będziesz chciał zmienić wersję wymienioną w POM. Następnie zamiast „SNAPSHOT” użyłbyś etykiety takiej jak „1.0”.
Aby uzyskać pomoc dotyczącą wersjonowania, zapoznaj się ze specyfikacją wersjonowania semantycznego .
„Wydanie” to ostateczna wersja dla wersji, która się nie zmienia.
„Migawka” to kompilacja, którą można zastąpić inną kompilacją o tej samej nazwie. Sugeruje to, że kompilacja może się zmienić w dowolnym momencie i nadal jest aktywnie rozwijana.
Masz różne artefakty dla różnych wersji opartych na tym samym kodzie. Np. Możesz mieć taki z debugowaniem, a drugi bez. Jeden dla Java 5.0 i jeden dla Java 6. Zasadniczo łatwiej jest mieć jedną kompilację, która robi wszystko, czego potrzebujesz. ;)
Wersje Maven mogą zawierać dosłowny ciąg „SNAPSHOT”, co oznacza, że projekt jest aktualnie w fazie rozwoju.
Na przykład, jeśli twój projekt ma wersję „1.0-SNAPSHOT” i wdrożysz artefakty tego projektu w repozytorium Maven, Maven rozszerzy tę wersję do „1.0-20080207-230803-1”, jeśli miałbyś wdrożyć wersję 11 : 20:00 w dniu 7 lutego 2008 r. UTC. Innymi słowy, podczas wdrażania migawki nie tworzysz wydania komponentu oprogramowania; zwalniasz migawkę komponentu w określonym czasie.
Dlatego głównie projekty migawkowe są używane w projektach będących w trakcie aktywnego rozwoju. Jeśli Twój projekt zależy od komponentu oprogramowania, który jest w trakcie opracowywania, możesz polegać na wersji migawki, a Maven będzie okresowo próbować pobrać najnowszą migawkę z repozytorium po uruchomieniu kompilacji. Podobnie, jeśli następne wydanie twojego systemu będzie miało wersję „1.8”, twój projekt będzie miał wersję „1.8-SNAPSHOT”, dopóki nie zostanie oficjalnie wydany.
Na przykład następująca zależność zawsze pobierałaby najnowszą wersję JAR 1.8 wiosny:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>1.8-SNAPSHOT”</version>
</dependency>
Przykład procesu uwalniania maven
Chciałbym zwrócić uwagę na terminologię. Inne odpowiedzi dały dobre wyjaśnienia na temat tego, czym jest wersja „migawka” w kontekście Maven. Ale czy wynika z tego, że wersję inną niż migawka należy nazwać wersją „release”?
Istnieje pewne napięcie między semantyczną wersją wersji „wydania”, która wydaje się być dowolną wersją, która nie ma kwalifikatora, takiego jak, -SNAPSHOT
ale nie ma takiego kwalifikatora, jak -beta.4
; oraz pomysł Mavena na wersję „release”, która wydaje się obejmować tylko brak -SNAPSHOT
.
Innymi słowy, istnieje semantyczna dwuznaczność tego, czy „wydanie” oznacza „możemy wydać je do Maven Central”, czy „oprogramowanie jest w ostatecznej wersji do publicznej wiadomości”. Możemy uznać -beta.4
za wersję „wydaną”, jeśli udostępnimy ją publicznie, ale nie jest to „wersja ostateczna”. Wersje semantyczne wyraźnie mówią, że coś takiego -beta.4
jest wersją „przedpremierową”, więc nie ma sensu nazywanie jej wersją, nawet bez niej -SNAPSHOT
. W rzeczywistości z definicji -rc.5
jest nawet kandydatem do wydania , a nie faktycznym wydaniem, nawet jeśli możemy pozwolić na publiczny dostęp do testowania.
Niezależnie od tego, Maven, moim zdaniem, bardziej odpowiednie wydaje się nazywanie wersji „release”, która nie ma żadnego kwalifikatora, nawet -beta.4
. Być może lepszą nazwą dla wersji innej niż migawka Maven byłaby wersja „stabilna” (zainspirowana inną odpowiedzią ). Zatem mielibyśmy:
1.2.3-beta.4-SNAPSHOT
: Wersja migawki wersji przedpremierowej.1.2.3-SNAPSHOT
: Migawka wersji wydania.1.2.3-beta.4
: Stabilna wersja wersji wstępnej.1.2.3
: Wersja wydania (która oczywiście jest stabilną wersją bez migawki).Tak wygląda migawka dla repozytorium iw tym przypadku nie jest włączona, co oznacza, że repozytorium, o którym mowa tutaj, jest stabilne i nie ma potrzeby aktualizacji.
<project>
...
<repositories>
<repository>
<id>lds-main</id>
<name>LDS Main Repo</name>
<url>http://code.lds.org/nexus/content/groups/main-repo</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
Kolejny przypadek dotyczyłby:
<snapshots>
<enabled>true</enabled>
</snapshots>
co oznacza, że Maven będzie szukał aktualizacji dla tego repozytorium. Możesz także określić odstęp czasu dla aktualizacji za pomocą znacznika.
zwykle w maven mamy dwa typy kompilacji 1) Kompilacje migawek 2) Kompilacje wydań
kompilacje migawek: SNAPSHOT to specjalna wersja, która wskazuje, że bieżąca kopia wdrożeniowa nie jest taka jak zwykła wersja, maven sprawdza wersję dla każdej kompilacji w zdalnym repozytorium, więc kompilacje migawek są jedynie kompilacjami programistycznymi.
Kompilacje wydania: Wydanie oznacza usunięcie SNAPSHOT w wersji kompilacji, są to zwykłe wersje kompilacji.
po prostu migawka oznacza, że jest to wersja niestabilna.
gdy wersja zawiera migawkę jak 1.0.0 -SNAPSHOT oznacza, że nie jest to stabilna wersja i poszukaj zdalnego repozytorium w celu rozwiązania zależności
zrozumienie kontekstu SDLC pomoże zrozumieć różnicę między migawką a wydaniem. Podczas procesu projektowania wszyscy programiści wnoszą swoje funkcje do podstawowej gałęzi. W pewnym momencie lider uważa, że zgromadzono wystarczającą liczbę funkcji, a następnie odetnie gałąź wydania z gałęzi linii bazowej. Wszelkie kompilacje sprzed tego punktu czasowego są migawkami. Posty do tego momentu są wydaniami. Należy pamiętać, że kompilacje wersji mogą również ulec zmianie przed przejściem do produkcji, jeśli wystąpi jakaś wada podczas testowania wersji.
Migawka oznacza po prostu, w zależności od konfiguracji, Maven sprawdzi najnowsze zmiany w specjalnej zależności. Migawka jest niestabilna, ponieważ jest w trakcie opracowywania, ale jeśli w specjalnym projekcie trzeba wprowadzić najnowsze zmiany, należy skonfigurować wersję zależności do wersji migawki. Ten scenariusz występuje w dużych organizacjach z wieloma produktami, które są ze sobą bardzo blisko powiązane.
Jak sama nazwa wskazuje, migawka odnosi się do stanu projektu i jego zależności w danym momencie. Ilekroć maven znajdzie nowszą SNAPSHOT projektu, pobiera i zastępuje starszy plik .jar projektu w lokalnym repozytorium.
Wersje migawkowe są używane w projektach w trakcie aktywnego opracowywania. Jeśli Twój projekt zależy od komponentu oprogramowania, który jest w trakcie opracowywania, możesz polegać na wersji migawki, a Maven będzie okresowo próbować pobrać najnowszą migawkę z repozytorium po uruchomieniu kompilacji.