fbpx

Wiele osób początkujących aby wprowadzić jakieś testowe zmiany w swoim projekcie nie zawsze korzysta z GITa. Czasem też jest realna potrzeba na sklonowanie projektu, aby rozwijać go zupełnie osobno. Pierwsza myśl? Kopiuj-Wklej. Nie jest to złe rozwiązanie, ale korzystając z CubeIDE odkryjemy, że jest z tym dosyć spory problem.

Moja historia z “problemem”

Aktualnie jestem w trakcie realizacji mojego największego projektu, jakim jest Kurs STM32 dla Poaczątkujących. Na jego potrzeby zmuszony jestem dzielić odpowiednie kawałki kodu na osobne projekty. Wszystko po to, aby lekcje były względnie odseparowane od siebie i kod z projektu do nich pasował.

Przykładowo pisząc UART używając Pollingu, zadeklarowałem jakieś zmienne itd. Generalnie coś w tym projekcie jest. Chciałbym teraz tą bazę wykorzystać do kolejnych lekcji, na przykład takiej o odbiorze z przerwaniami.

Jednak nie chcę ruszać tej bazy, bo będę ją udostępniał jako kody do lekcji wcześniejszej. Pomysł – kopia projektu. Prawy przycisk myszy -> Kopiuj -> Wklej obok.

Zmieniasz nazwę folderu. Zmieniasz nazwę pliku *.ioc dla Cube. Zresztą sam Cube zacznie krzyczeć, że folder i *.ioc musi nazywać się identycznie jak folder projektu, aby to działało.

Jest wszystko pięknie, piszesz kod w nowym projekcie i wszyscy się cieszą. Najbardziej to diabeł bo, gdy przychodzi ten moment, że chcesz wrzucić projekt-bazę dla kursantów okazuje się, że NIE MA W NIM PLIKÓW ŹRÓDŁOWYCH FOLDERU Src. WSZYSTKICH!

“Szok, rozpacz, niedowierzanie. Jakaś resztka nadziei”. Ten cytat znanego polityka ciśnie się na usta. Niektórym tak jak, mi nawet trochę ostrzejsze słowa. Projekt-baza wyparował. Nie ma nic. Co teraz? Niestety jeśli nie było żadnej kopii na zewnętrznym repozytorium – wszystko przepadło. Trzeba odtwarzać.

W czym leży problem?

Poguglałem, poczytałem, ale nie znalazłem prawidłowej odpowiedzi. Niektórzy mówią, że chodzi o plik ustawień projektu w IDE –  .project. Czyli problem powinien występować w każdym Eclipse’owym środowisku. Jednak nie pamiętam, abym kiedyś miał takie problemy przy AVRach… Kopiowałem, przenosiłem i modyfokowałem projekty na AVR bez żadnego znikania.

Problem niestety leży w CubeMX i jego opercjach na plikach. Dokładnie to w tym, do których ścieżek w projekcie się odwołuje. Kroki do odtworzenia znikania plików:

  1. Tworzysz Projekt Źródło.
  2. Generujesz w nim pliki przez CubeMX
  3. Wchodzisz do folderu z projektami.
  4. Kopiujesz Projekt Źródło
  5. Wklejasz kopię
  6. Zmieniasz nazwę Projektu Kopii
  7. Zmieniasz nazwę *.ioc Projektu Kopii
  8. Odpalasz *.ioc Projektu Kopii
  9. Robisz zmiany jesli chcesz
  10. Generujesz ponownie Projekt Kopię
  11. Pliki Src w Projekt Źródło znikają

Dlaczego?

Każdy projekt CubeMX ma specjalny plik .mxproject w swoim katalogu. W nim jest informacja o tym jakich plików używa CubeMX do generowania projektu.

No i najważniejsza informacja – które pliki zostały wygenerowane poprzednio. Ma to na celu wytypowanie wszystkich plików, które mają podlegać przegenerowaniu. Z moich obserwacji wynika, że pliki “poprzednie” są kasowane w całości.

Brane z nich są jedynie fragmenty w znacznikach USER CODE i przepisywane są do kompletnie nowych plików. Cube nie bawi się w modyfikacje już istniejących plików. Kasuje je jak leci i przenosi jedynie kod użytkownika.

Po skopiowaniu “Projekt_Zrodlo” do “Projekt_Kopia” otworzyłem plik .mxproject. W środku wygląda tak.

Zwróć uwagę na sekcję [PreviousGenFiles]. Tam są ścieżki do projektu-źródła. Do tego są to ścieżki BEZWZGLĘDNE. Te pliki są kasowane przy regeneracji projektu. Jeśli tak, to można ścieżkę, a w zasadzie to samą nazwę projektu podmienić na nową, prawda?

Po podmianie sekcja [PreviousGenFiles] wygląda tak.

Próba przegenerowania projektu-kopii nie niszczy już projektu-źródła!

Sukces!

Jakiś FIX na to Panie ST?

Fix byłby banalnie prosty. Wystarczyłoby zamienić ścieżki bezwzględne na ścieżki względne w pliku .mxproject. Jednak to musiałoby zrobić już samo ST w swoim narzędziu.

Ciekawe jest to, że we wsześniejszych sekcjach pliku .mxproject są właśnie ścieżki względne. Jestem ciekaw czym kierowało się ST robiąc coś takiego…

Bo dosyć łatwo będzie nam odkryć taką niespodziankę w tym samym Workspace. Gorzej, jeśli przeniesiemy projekt zupełnie gdzie indziej. Wtedy czai się uzbrojona bomba, która tylko czekana usunięcie plików spod bezwzględnej ścieżki 🙂

Podsumowanie

Problem jest i to dosyć spory. Narobił mi kilka dodatkowych godzin roboty przy kursie. Kurs to pół biedy. Gorzej, gdyby skasowane zostały jakieś grube projekty komercyjne.

Jedno jest pewnie – backupy, backupy, backupy. Trzeba robić backupy poza naszym komputerem. Git z chmurowym repozytorium będzie do tego odpowiedni. Wtedy łatwo taką niespodziankę jest po prostu odwrócić.

Fajnie jakby ST poprawiło ten problem. Kto wie, może trafi do nich mój post. Byłoby mi miło 🙂

Póki co pamiętaj co trzeba robić, aby być bezpiecznym projektowo.

Jeśli artykuł Ci się spodobał, kup coś u mnie! ? https://sklep.msalamon.pl/

Jeśli zauważyłeś jakiś błąd, nie zgadzasz się z czymś, chciałbyś coś dodać istotnego lub po prostu uważasz, że chciałbyś podyskutować na ten temat, napisz komentarz. Pamiętaj, że dyskusja ma być kulturalna i zgodna z zasadami języka polskiego.

Podobne artykuły

.

18 Komentarzy

Sitar · 18/11/2020 o 09:37

Ciekawą sytuację miałem niedawno, choć nie związaną z kasowaniem plików.
Otóż w main.c przez inną osobę została skopiowana funkcja, wygenerowana przez CubeMX, a zawierała ona sekcję USER_CODE_5, która nieopatrznie też została powielona. Nazwa i treść funkcji-kopii zostały zmienione zgodnie z zamiarami, orginał został, ale niezauważone i niepotrzebne w kodzie pozostały dwie sekcje USER_CODE o tym samym numerze – a przecież funkcja-kopia była już w całości w sekcji user.
Jakie było moje zdumienie, gdy pisząc coś w funkcji-kopii, po generacji to znikało i stawało się takie samo, jak w funkcji-orginale. I odwrotnie, pisząc coś w funkcji-orginale, po generacji takie same zmiany pojawiały się w funkcji-kopii.
Ja oczywiście wkurzony na całe ST, że co to znowu za bubel.. na szczęście w końcu zauważyłem, że USER_CODE mają taki sam numer i ciekawostka okazała się błędem użytkownika.

Przemek · 13/11/2020 o 11:58

Aż tak się Cubem nie bawiłem, żeby kopiować projekty itp w ten sposób – ale ciekawy bug – pewnie ten feature robiła inna ekipa i tam zapomnieli jak poprawnie używać ścieżek – w tGFXie od ST są też podobne rozwiązania :/

Swoją drogą zawsze mnie zastanawia, czy twórcy tych rozwiązań mają na uwadze jaki wpływ mają ich błędy – niech takie coś zmarnuje komuś powiedzmy 2h pracy to jeszcze nic, ale jak to się stanie u 100 osób w różnych firmach to już wpływ jest dość spory :/

    Janusz · 18/11/2020 o 19:53

    Przecież to jest outsource’owane do Indii. Myślę, że mają to głęboko gdzieś.

      Przemek · 29/11/2020 o 11:11

      No niestety na to wygląda :/

Qrdel · 12/11/2020 o 21:29

Zauważam dziwny efekt echa. Z telewizorów (sąsiadów, ja nie mam) dobiegają wulgaryzmy, a chwilę potem Pan Mateusz podobnie wyraża się na blogu.
Nie dziwi mnie i nawet zbytnio nie oburza, że pokrzyczałeś sobie przed monitorem we własnym domu.
Ale rozsyłanie maili z takim tekstem w temacie to dla mnie dosyć niski chwyt marketingowy.
Może skuteczniej zaskoczysz czytelników stosując choćby lepszą korektę tekstów.

Maciej

    Mateusz Salamon · 12/11/2020 o 21:52

    Zobacz jak zadziałało 🙂 Nie dość, że przeczytałeś post, to jeszcze napisałeś komentarz 😉 Może chciałbyś się zająć korektą, bo póki co robię wszystko samodzielnie?

    Mateusz Salamon · 12/11/2020 o 22:00

    A tak poza tym lepiej nie oglądać TV bo wszyscy na wszystkich napuszczają tylko 🙂

Kamil · 12/11/2020 o 10:43

Dlatego moim zdaniem lepszym rozwiązaniem jest wygenerowanie w CubeMX Makefile i prace z projektem przy użyciu jakiegoś edytora tekstu np. Visual Studio Code. Poza tym ostatnio CubeMX też mnie trochę zawodzi – nie wiem czy mieliście ten problem ale podczas generowania kodu czasem usuwa mi losowy plik źródłowy np. main.c albo usart.c w zależności co konfiguruje. No i oczywiście zgodzę się z przedmówcami – git to podstawa.

    Mateusz Salamon · 12/11/2020 o 21:58

    Wszystko potrafi zawodzić 🙁 Przy wielkich projektach trzeba się uzbroić w kilka backupów 😀

Anrzej · 12/11/2020 o 09:58

Git, git,git… A co dla początkującego który nie umie i nie chce używać git-a? Wydaje mi się że sprawne i bez błędów środowisko programistyczne powinno wystarczyć. I takie powinno być STM32CubeIDE! No i proste kopiowanie workspace-u jako backup projektów. That’s all!

    Andrzej · 12/11/2020 o 10:16

    A próbował może ktoś kroków: Export_projektu / edycja niezbędnych plików (nazw projektu) / Import_projektu ?

    Mateusz Salamon · 12/11/2020 o 21:53

    O gicie można czasem zapomnieć, albo tak jak ja używać, gdy już projekt ma ręce i nogi. Nie do wszystkiego wytaczam najcięższe działa 🙁

    Janusz · 18/11/2020 o 19:57

    A nie chce, bo nie umie? Git to są 3 komendy na krzyż i nic w nim ciężkiego nie ma.

Jarek · 12/11/2020 o 06:25

Git, nawet lokalnie, powinien zaradzić temu problemowi. Byleby od razu zrobić init i często komentować. Co nie oznacza, że trzeba rezygnować z kopi na zewnętrzym nośniku! Nie, kopia musi być na inne przypadki.

    Mateusz Salamon · 12/11/2020 o 21:55

    I weź pamiętaj commitować co chwila 😛 W ogóle wiele rzeczy trzeba pamiętać 🙁 Dropbox lub GDrive są spoko bo pamiętają za Ciebie 😀

Taras · 11/11/2020 o 20:33

IMHO, Git to jest podstawa przy kodowaniu. Wszystko(!!!) musi być w tym. Spoczatku “git init” pozdnej kodowanije.

    Mateusz Salamon · 12/11/2020 o 21:56

    I co po “git init” jak o commit też możesz zapomnieć. Mało tego, kto wie czy kiedyś CubeMX nie skasuje też folderu .git 😀

      Kuba · 14/11/2020 o 21:09

      Niestety ale kasuje 😉 jak dobre pamiętam, to przy wskazaniu folderu dla nowego projektu w Cube, gdzie już znajduje się .git, po pierwszym wygenerowaniu projektu GIT nam znika

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *