Część 4: Hello Modules¶
Tłumaczenie wspomagane przez AI - dowiedz się więcej i zasugeruj ulepszenia
Ta sekcja opisuje, jak organizować kod workflow, aby rozwój i utrzymanie pipeline było bardziej efektywne i zrównoważone. W szczególności pokażemy, jak używać modułów.
W Nextflow moduł to pojedyncza definicja procesu zamknięta w samodzielnym pliku kodu. Aby go użyć w pipeline, wystarczy dodać jednoliniową instrukcję importu; następnie można zintegrować dany proces ze strukturą workflow w standardowy sposób. Umożliwia to ponowne wykorzystanie definicji w wielu pipeline'ach bez tworzenia wielu kopii kodu.
Kiedy zaczęliśmy rozwijać nasz workflow, napisaliśmy wszystko w jednym pliku kodu. Teraz przeniesiemy procesy do indywidualnych modułów.
To sprawi, że nasz kod będzie bardziej współdzielny, elastyczny i łatwy w utrzymaniu.
Jak zacząć od tej sekcji
Ta sekcja kursu zakłada, że ukończyłeś Części 1-3 kursu Hello Nextflow, ale jeśli znasz podstawy omówione w tych sekcjach, możesz zacząć od tego miejsca bez żadnych dodatkowych przygotowań.
0. Rozgrzewka: Uruchom hello-modules.nf¶
Użyjemy skryptu workflow hello-modules.nf jako punktu wyjścia.
Jest on równoważny skryptowi utworzonemu podczas pracy nad Częścią 3 tego szkolenia, z tą różnicą, że zmieniliśmy miejsca docelowe wyjść:
| hello-modules.nf | |
|---|---|
Aby upewnić się, że wszystko działa, uruchom skrypt raz przed wprowadzeniem jakichkolwiek zmian:
Wynik polecenia
Jak poprzednio, pliki wyjściowe znajdziesz w katalogu określonym w bloku output (tutaj results/hello_modules/).
Zawartość katalogu
Jeśli to zadziałało, jesteś gotowy do nauki modularyzacji kodu workflow.
1. Utwórz katalog do przechowywania modułów¶
Najlepszą praktyką jest przechowywanie modułów w konkretnym katalogu.
Możesz nazwać ten katalog jak chcesz, ale konwencja nakazuje nazywać go modules/.
Wskazówka
Tutaj pokazujemy, jak używać lokalnych modułów, czyli modułów przechowywanych lokalnie w tym samym repozytorium co reszta kodu workflow, w przeciwieństwie do modułów zdalnych, które są przechowywane w innych (zdalnych) repozytoriach. Więcej informacji o modułach zdalnych znajdziesz w dokumentacji.
2. Utwórz moduł dla sayHello()¶
W najprostszej formie przekształcenie istniejącego procesu w moduł to niewiele więcej niż operacja kopiuj-wklej. Utworzymy plik dla modułu, skopiujemy odpowiedni kod, a następnie usuniemy go z głównego pliku workflow.
Potem wystarczy dodać instrukcję importu, aby Nextflow wiedział, że ma pobrać odpowiedni kod w czasie wykonania.
2.1. Utwórz plik dla nowego modułu¶
Utwórzmy pusty plik dla modułu o nazwie sayHello.nf.
To daje nam miejsce na umieszczenie kodu procesu.
2.2. Przenieś kod procesu sayHello do pliku modułu¶
Skopiuj całą definicję procesu z pliku workflow do pliku modułu, upewniając się, że kopiujesz również shebang #!/usr/bin/env nextflow.
| modules/sayHello.nf | |
|---|---|
Po wykonaniu tego usuń definicję procesu z pliku workflow, ale upewnij się, że zostawiasz shebang na miejscu.
2.3. Dodaj deklarację importu przed blokiem workflow¶
Składnia importowania lokalnego modułu jest dość prosta:
Wstawmy ją powyżej bloku params i wypełnijmy odpowiednio.
Widzisz, że wypełniliśmy nazwę modułu, sayHello, oraz ścieżkę do pliku zawierającego kod modułu, ./modules/sayHello.nf.
2.4. Uruchom workflow¶
Uruchamiamy workflow z zasadniczo tym samym kodem i wejściami co poprzednio, więc uruchommy z flagą -resume i zobaczmy, co się stanie.
Wynik polecenia
To powinno się wykonać bardzo szybko, ponieważ wszystko jest w cache. Możesz sprawdzić opublikowane wyjścia.
Nextflow rozpoznał, że nadal jest to ta sama praca do wykonania, nawet jeśli kod jest podzielony na wiele plików.
Podsumowanie¶
Wiesz już, jak wyodrębnić proces do lokalnego modułu i wiesz, że nie wpływa to na możliwość wznawiania workflow.
Co dalej?¶
Ćwicz tworzenie kolejnych modułów. Gdy zrobisz jeden, możesz zrobić milion więcej... Ale na razie zróbmy jeszcze tylko dwa.
3. Zmodularyzuj proces convertToUpper()¶
3.1. Utwórz plik dla nowego modułu¶
Utwórz pusty plik dla modułu o nazwie convertToUpper.nf.
3.2. Przenieś kod procesu convertToUpper do pliku modułu¶
Skopiuj całą definicję procesu z pliku workflow do pliku modułu, upewniając się, że kopiujesz również shebang #!/usr/bin/env nextflow.
| modules/convertToUpper.nf | |
|---|---|
Po wykonaniu tego usuń definicję procesu z pliku workflow, ale upewnij się, że zostawiasz shebang na miejscu.
3.3. Dodaj deklarację importu przed blokiem params¶
Wstaw deklarację importu powyżej bloku params i wypełnij ją odpowiednio.
To powinno zacząć wyglądać bardzo znajomo.
3.4. Uruchom workflow ponownie¶
Uruchom z flagą -resume.
Wynik polecenia
To powinno nadal produkować takie same wyjście jak poprzednio.
Dwa zrobione, jeszcze jeden do zrobienia!
4. Zmodularyzuj proces collectGreetings()¶
4.1. Utwórz plik dla nowego modułu¶
Utwórz pusty plik dla modułu o nazwie collectGreetings.nf.
4.2. Przenieś kod procesu collectGreetings do pliku modułu¶
Skopiuj całą definicję procesu z pliku workflow do pliku modułu, upewniając się, że kopiujesz również shebang #!/usr/bin/env nextflow.
Po wykonaniu tego usuń definicję procesu z pliku workflow, ale upewnij się, że zostawiasz shebang na miejscu.
4.3. Dodaj deklarację importu przed blokiem params¶
Wstaw deklarację importu powyżej bloku params i wypełnij ją odpowiednio.
| hello-modules.nf | |
|---|---|
Ostatni!
4.4. Uruchom workflow¶
Uruchom z flagą -resume.
Wynik polecenia
To powinno nadal produkować takie same wyjście jak poprzednio.
Podsumowanie¶
Wiesz już, jak modularyzować wiele procesów w workflow.
Gratulacje, wykonałeś całą tę pracę i absolutnie nic się nie zmieniło w działaniu pipeline!
Żarty na bok, teraz Twój kod jest bardziej modularny, a jeśli zdecydujesz się napisać inny pipeline, który wywołuje jeden z tych procesów, wystarczy wpisać jedną krótką instrukcję importu, aby użyć odpowiedniego modułu. Jest to lepsze niż kopiowanie-wklejanie kodu, ponieważ jeśli później zdecydujesz się ulepszyć moduł, wszystkie Twoje projekty odziedziczą te ulepszenia.
Co dalej?¶
Zrób krótką przerwę, jeśli masz ochotę.
Gdy będziesz gotowy, przejdź do Część 5: Hello Containers, aby dowiedzieć się, jak używać kontenerów do wygodniejszego i bardziej powtarzalnego zarządzania zależnościami oprogramowania.
Quiz¶
Czym jest moduł w Nextflow?
Jaka jest zalecana konwencja nazewnictwa plików modułów?
Gdzie powinny być przechowywane pliki modułów?
Jaka jest poprawna składnia do importowania modułu?
Co się dzieje z funkcjonalnością -resume podczas używania modułów?
Jakie są korzyści z używania modułów? (Wybierz wszystkie pasujące)