2009-09-21 16 views
23

Załóżmy, że zespół programistów tworzy aplikację internetową w Perlu i używa git do hostowania swojego kodu. Teraz mają mały problem z wersjami ich moduły:

  • Perl::Critic i PBP zarówno polecić RCS-backed $VERSION zmienną w kodzie
  • git wyraźnie zaleca przed użyciu wymiennych numery wersji w kodzie (z dobrego uzasadnienia)

Rozumiem, dlaczego git nie rozwija słów kluczowych. Mogę jednak doskonale rozumieją potrzebę numerów wersji dla kawałka kodu:

  • Robisz potrzebny osobny wersjonowanie dla każdego modułu, ponieważ może chcesz używać numerów wersji use
  • Prawdopodobnie don „t chcesz zmienić te numery wersji dla szybko zmieniających moduł ręcznie

globalna wersja produktu do pakowania i testowania można łatwo wdrożyć z etykietkami i git describe, ale nadal nie widać sposób na wprowadzenie automatycznej wersji dla pojedynczych modułów.

Czy masz jakieś rozwiązanie dla mnie?

+0

To jest dobre pytanie. Ale czy Perl :: Critic i/lub PBP naprawdę polecają numery wersji RCS? AFAI, naprawdę nie obchodzi ich, skąd pochodzą te liczby. – innaM

+1

@Manni: tak, nie przejmują się, ale nadal polecają RCS jako "najlepszą praktykę": "Powszechną praktyką jest użycie słowa kluczowego $ Revision: 3629 $, aby automatycznie zdefiniować zmienną $ VERSION w następujący sposób: nasz ($ VERSION) = '$ Wersja: 3629 $' = ~ m {\ $ Wersja: \ s + (\ S +)} x; " –

+0

Ja współczuję, ponieważ jestem obecnie w dokładnie tej samej sytuacji. Domyślam się, że wraz z coraz większą liczbą projektów wykorzystujących git, praktyka będzie coraz mniej powszechna. – innaM

Odpowiedz

20

Zapomnij o tym, co mówi Perl Best Practices. Nie jest to Biblia, a jedynie sugeruje użycie słów kluczowych RCS, ponieważ w tamtym czasie nikt nie myślał o innych systemach kontroli źródła. Twoim celem nigdy nie powinna być zgodność z konkretną implementacją PBP, ale dostosowywanie pomysłów w PBP do twojej własnej sytuacji. Pamiętaj, aby przeczytać pierwszy rozdział tej książki.

Najpierw naprawić swoje założenia:

  1. Nie trzeba osobną wersję dla każdego modułu w dystrybucji. Musisz tylko nadać każdemu plikowi modułu wersję, która jest inna niż w poprzednich dystrybucjach. Każdy moduł w dystrybucji może mieć tę samą wersję, a kiedy to zrobi, wszystkie mogą być większe niż wersja z ostatniej dystrybucji.

  2. Dlaczego ręcznie nie zmieniać wersji szybko zmieniającego się modułu?Powinieneś mieć określone punkty, w których twój kod staje się czymś, z czego ludzie mogą korzystać. W tych kwestiach robisz coś, aby powiedzieć, że podjąłeś decyzję, że twój produkt pracy powinien zostać rozpowszechniony, czy to jako test, czy stabilny. Zmieniasz wersje jako sposób informowania ludzi o swoim rozwoju. Kiedy pozwolisz, aby system kontroli źródła zrobił to tylko dlatego, że popełniłeś błąd, tracisz szansę na oznaczenie cykli w swoim rozwoju. Na przykład zwykle używam dwóch mniej ważnych wydań. Oznacza to, że dostaję 100 wydań, zanim kompilacja wyjdzie z wack i muszę wybić główną wersję, aby przywrócić prawidłową kolejność sortowania. To za mało miejsca w wersji, jeśli pozwolę, aby VCS sobie z tym poradził.

Użyłem słów kluczowych RCS do połączenia wersji moich modułów z ich numerem meldunku lub wersji, ale nigdy tak naprawdę się nie podobało. Wykonuję wiele commitów do pliku, zanim będzie on gotowy do następnej wersji, i nie potrzebuję zmiany, tylko dlatego, że poprawiłem błąd w dokumentacji. Będą duże skoki w numerach wersji, ponieważ wprowadziłem wiele drobnych zmian.

Teraz po prostu zmieniam wersje wszystkich moich plików modułów, kiedy jestem gotowy do wydania nowej dystrybucji. Używam ppi_version zmienić wszystkie wersje na raz:

ppi_version change 1.23 1.24 

Wszystkie moje pliki modułu uzyskać ten sam $VERSION. Nie muszę używać $VERSION, aby je odróżnić, ponieważ używam do tego zwykłych funkcji kontroli źródła. Nie potrzebuję $VERSION, aby powiązać go z konkretnym zatwierdzeniem.

Jeśli pracuję nad nową dystrybucją z wersji 1.23, zaczynam tworzyć wersje rozwojowe 1.23_01, 1.23_02 itd., Ale tylko wtedy, gdy jestem gotowy, aby umożliwić ludziom wypróbowanie tych wersji. Zmieniam wersję na początku cyklu, a nie koniec. Wszystkie moje zatwierdzenia prowadzące do następnego wydania mają już następną wersję. Robię także notatki o tym, co chcę osiągnąć w tym cyklu.

Kiedy myślę, że to początek nowego cyklu, ponownie wybieram wersję. Kiedy wydaje mi się, że mam stabilną wersję, zmieniam wersję $VERSION na stabilną, np. 1.23_04 na 1.24. Ilekroć coś wypuszczam, oznaczam to również w kontroli źródła. Widzę, że moje główne punkty rozwoju są dość łatwe w dopasowaniu do źródła.

W ten sposób wszystko jest dla mnie łatwiejsze. Nic nie jest powiązane z kontrolą źródła, z której zdecyduję się korzystać, więc nie muszę przerabiać wszystkiego, jeśli zmienię to, czego używam.

+1

Wystarczy wyjaśnić: w moim zespole jestem głównie tym, który płacze "F ** k PBP!" ;-) Chciałem raczej dowiedzieć się, czy istnieje lepsza metoda niż to, co planuję zrobić. ppi_version to tylko jedna z takich wskazówek, na które liczyłem, więc dziękuję bardzo! –

+0

Dzięki za podpowiedź na temat ppi_version! http://search.cpan.org/dist/PPI-PowerToys/lib/PPI/PowerToys.pm –

3

Po wprowadzeniu niekompatybilnych zmian wybrałbym opcję ręcznego wstawiania, ponieważ z pewnością nie każda zmiana usprawiedliwia uderzenie.

Można też do kasy z „gitattributes” manpage atrybutu filter - być może będzie chciał wprowadzić swój własny filtr do robienia podstawienia w oparciu o „git describe” wyjście automatycznie.

+1

Czy jesteś pewien, że filtr mógłby w tym przypadku pomóc? git nie ma czegoś takiego jak numery wersji. Więc co zrobiłby filtr, gdy powiesz mu, żeby wstawił gdzieś numer wersji? – innaM

+2

Manni, filtr implementowałby wersjonowanie na podstawie znaczników i wyjście 'git describe'. –

+2

Zasadniczo, dane wyjściowe 'git describe', które są dobre, gdy są oparte na tagach. –

0

Jak o czymś naprawdę leniwy, która jest tylko nieco niechlujny:

Można napisać drobny wrapper dla git-add. Przed wywołaniem git-add, wrapper podsuwałby numer wersji gdzieś w module, gdzie można go znaleźć za pomocą prostego wyrażenia regularnego.

Aktualizacja:

nie jestem obecnie za pomocą czegoś tak sobie, ale ja poważnie o tym myśleć.

Mój obecny rozumowanie:

  • W przeciwieństwie do CVS lub Subversion, Git nie nic o numerach wersji lub zmiany znać.
  • Sterowniki filtrów musiałyby mieć inne źródło informacji, aby móc wstawić numer wersji, a to źródło powinno być dostępne na komputerze dowolnego z programistów.
  • Tak więc najlepszym źródłem numeru wersji jest sam plik wersji.
  • A dla samego pliku, który może być użyty jako źródło dla następnego numeru wersji, numer wersji musi być częścią odpowiadającego mu git blob.

Korzyści:

  • To jest tak, jak to robi automatyczny, nie ma sposobu, aby zapomnieć zaktualizować swój numer wersji.
  • Płynne przejście z CVS/SVN do git. Każde zatwierdzenie wprowadza nową wersję.

Wady:

  • Leniwy deweloper, który zawsze robi git add . będzie szturchać numerów wersji plików nie dotknąć.
  • Wydaje się, że nie ma sposobu na wymuszenie użycia skryptu opakowania.
+0

Nie ma potrzeby pakowania - to właśnie robią sterowniki filtrów. –

+0

Nie. To absolutnie nie to, co robią. Sterownik filtra będzie rozmazywał plik przy kasie i czyści go po dodaniu. Sugeruję, że jest to numer wersji, który faktycznie trafia do bloba, a tym samym do listy zmian. – innaM

+1

To nie jest celem filtru, ale haczyk 'pre-commit' może lepiej niż owijać' add'. –

3

Czego używasz do budowania swojego modułu Perla?

Rozwiązanie stosowane przez jądro Linuksa i projektu Git sam ma zastąpić "++ WERSJA ++" (lub "++ PROJECT_VERSION ++" lub "@@ PROJECT_VERSION @@") Symbole zastępczeprzez system kompilacji, w takim przypadku przez Makefile. (W plikach w C odbywa się to poprzez zdefiniowanie stałej procesora "PROJECT_VERSION", poprzez opcję "-DPROJECT_VERSION=$(PROJECT_VERSION)" przekazaną kompilatorowi). W twoim przypadku będzie to prawdopodobnie coś w stylu: Module::Install, Module::Build lub ExtUtils::MakeMaker.

jądro Zarówno Git ans Linux używa do tego GIT-VERSION-GEN skryptu:

  1. używa git describe jeśli projekt jest zbudowany od wewnątrz repozytorium git,
  2. wraca na version (lub VERSION lub GIT-VERSION-FILE) jeśli kompilacji jest wykonywany z migawki (ten plik jest tworzony podczas tworzenia migawki/archiwum),
  3. i w końcu wraca na predefiniowany numer wersji, którego numer jest aktualizowany w zatwierdzeniu, które oznacza nową wydaną wersję (np. cb572206 commit w repozytorium git, aka commit v1.6.4.4).

Mam nadzieję, że ci to pomoże.

Powiązane problemy