{"id":2586,"date":"2022-02-07T00:00:00","date_gmt":"2022-02-07T00:00:00","guid":{"rendered":"https:\/\/appvinio.runbyit.com\/https-appvinio-com-pl-aktualnosci-grinder\/"},"modified":"2023-11-07T14:53:08","modified_gmt":"2023-11-07T14:53:08","slug":"grinder","status":"publish","type":"post","link":"https:\/\/appvinio.com\/pl\/grinder\/","title":{"rendered":"Grinder &#8211; Jeszcze mniej pracy, jeszcze wi\u0119cej programowania"},"content":{"rendered":"<p>Mo\u017cliwe, \u017ce spotkali\u015bcie si\u0119 kiedy\u015b z problemem z build_runner\u2019em. Patrz\u0105c na niego z boku biblioteka jest bardzo przydatna. Ma jednak jedn\u0105 zasadnicz\u0105 wad\u0119, kt\u00f3ra mnie razi, a zwi\u0119\u017ale nazywa si\u0119: <em>flutter pub run build_runner build &#8211;delete-conflicting-outputs<\/em>.<\/p>\n<p>Niekt\u00f3rzy z was pewnie u\u017cywaj\u0105 biblioteki <em>fvm<\/em>, kt\u00f3ra pozwala zarz\u0105dza\u0107 wersjami Fluttera. Mo\u017ce napotkali\u015bcie te\u017c na problem, w momencie kiedy w <em>Android Studio<\/em> u\u017cywacie pluginu <em>intl<\/em>. Przy ni\u017cszych wersjach Fluttera potrafimy dostawa\u0107 b\u0142\u0119dy przy generowaniu plik\u00f3w z tekstami. Najlepszym rozwi\u0105zaniem tego jest wygenerowanie ich r\u0119cznie komend\u0105 <em>flutter &#8211;no-color pub global run intl_utils:generate<\/em>.<\/p>\n<p>Na pewno nie jednej osobie zdarzy\u0142o si\u0119 zapomnie\u0107 tych komend na pocz\u0105tku swojej kariery. Na pewno wielu z was ma ju\u017c dodane je jako aliasy systemowe. Dzisiaj postaram si\u0119 przedstawi\u0107 Wam opcj\u0119 kt\u00f3r\u0105 ja preferuje, rozwi\u0105zuj\u0105c\u0105 te i inne problemy, w czasie, kiedy musimy wyj\u015b\u0107 z IDE do konsoli.<\/p>\n<h2 id=\"Uwaga\" data-renderer-start-pos=\"1259\">Uwaga<\/h2>\n<p data-renderer-start-pos=\"1266\">Na urz\u0105dzeniach z systemem windows, biblioteki Dartowe, kt\u00f3re dodaj\u0105 w\u0142asne komendy wykonuj\u0105 si\u0119 podw\u00f3jnie (Stan na pa\u017adziernik 2021), jest to spowodowane kolejno\u015bci\u0105 wczytywania zmiennej <em>Path<\/em>\u00a0w systemie, wi\u0119cej informacji m.in. w tym issue &#8211; <span data-inline-card=\"true\" data-card-url=\"https:\/\/github.com\/leoafarias\/fvm\/issues\/227\"><span class=\"loader-wrapper\"><span style=\"text-decoration: underline;\"><a class=\"sc-hmzhuo krhyBX\" tabindex=\"0\" role=\"button\" href=\"https:\/\/github.com\/leoafarias\/fvm\/issues\/227\" data-testid=\"inline-card-resolved-view\"><span class=\"sc-gisBJw guKjte\"><span class=\"sc-ksYbfQ jHwjmi\">[BUG] fvm runs commands twice on [Windows] \u00b7 Issue #227 \u00b7 leoafarias\/fvm<\/span><\/span><\/a><\/span>.<\/span><\/span><\/p>\n<h3 id=\"Grinder\" data-renderer-start-pos=\"1513\">Grinder<\/h3>\n<p data-renderer-start-pos=\"1522\">Grinder to pot\u0119\u017cnym narz\u0119dziem pozwalaj\u0105cym na pisanie w\u0142asnych komend, czy raczej alias\u00f3w dla podprogram\u00f3w dartowych. Dzia\u0142a on o tyle prosto, \u017ce wystarczy doda\u0107 komend\u0119 w kodzie z odpowiedni\u0105 adnotacj\u0105 i gotowe!<\/p>\n<div class=\"code-block sc-exAgwC bECVZf\"><span class=\"prismjs css-10fl9lg\" data-code-lang=\"dart\" data-ds--code--code-block=\"\"><code class=\"language-dart\"><span class=\"\">@<\/span><span class=\"token class-name\">Task<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'build model'<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"comment linenumber react-syntax-highlighter-line-number\">2<\/span><span class=\"token keyword\">void<\/span> <span class=\"token function\">build<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"comment linenumber react-syntax-highlighter-line-number\">3<\/span>  <span class=\"token keyword\">try<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"comment linenumber react-syntax-highlighter-line-number\">4<\/span>    <span class=\"token function\">log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'building...'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"comment linenumber react-syntax-highlighter-line-number\">5<\/span><br \/>\n<span class=\"comment linenumber react-syntax-highlighter-line-number\">6<\/span>    <span class=\"token function\">run<\/span><span class=\"token punctuation\">(<\/span><br \/>\n<span class=\"comment linenumber react-syntax-highlighter-line-number\">7<\/span>      <span class=\"token string\">'fvm flutter pub run build_runner build --delete-conflicting-outputs --no-fail-on-severe --verbose &gt; build_log.txt'<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"comment linenumber react-syntax-highlighter-line-number\">8<\/span><span class=\"\">      quiet<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token function\">isQuiet<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"comment linenumber react-syntax-highlighter-line-number\">9<\/span><span class=\"\">      runOptions<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">RunOptions<\/span><span class=\"token punctuation\">(<\/span><span class=\"\">runInShell<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"comment linenumber react-syntax-highlighter-line-number\">10<\/span>    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"comment linenumber react-syntax-highlighter-line-number\">11<\/span>  <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">catch<\/span> <span class=\"token punctuation\">(<\/span><span class=\"\">error<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"comment linenumber react-syntax-highlighter-line-number\">12<\/span>    <span class=\"token function\">handleError<\/span><span class=\"token punctuation\">(<\/span><span class=\"\">error<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"comment linenumber react-syntax-highlighter-line-number\">13<\/span>  <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"comment linenumber react-syntax-highlighter-line-number\">14<\/span><span class=\"token punctuation\">}<\/span><\/code><\/span><\/div>\n<p data-renderer-start-pos=\"2068\">\/\/ komenda dla build_runnera<\/p>\n<p data-renderer-start-pos=\"2098\">Pozwala nam to skr\u00f3ci\u0107 t\u0119 potwornie d\u0142ug\u0105 komend\u0119 do prostego <em>grind build<\/em>. Mo\u017cemy nawet si\u0119 pokusi\u0107 o dodatkowe funkcje np zapisuj\u0105ce logi do pliku.<\/p>\n<p data-renderer-start-pos=\"2249\">To rozwi\u0105zanie doskonale sprawdza si\u0119 w po\u0142\u0105czeniu z opisywanym ju\u017c przeze mnie Masonem (link do artyku\u0142u o masonie). Pozwala ona przenosi\u0107 nasze programy do nowych projekt\u00f3w bez konieczno\u015bci pami\u0119tania o nich. Mo\u017cna tak\u017ce spr\u00f3bowa\u0107 po\u0142\u0105czy\u0107 oba rozwi\u0105zania i utworzy\u0107 system, kt\u00f3ry b\u0119dzie wykonywa\u0107 jeszcze wi\u0119cej roboty za nas!<\/p>\n<p data-renderer-start-pos=\"2580\">Wracaj\u0105c do sedna artyku\u0142u, Grinder nie jest jednak bez kilku wad, z kt\u00f3rymi na ten moment jeszcze walcz\u0119. Przede wszystkim, jak mo\u017cecie zauwa\u017cy\u0107, u\u017cywam metody <em>handleError<\/em>, kt\u00f3ra obs\u0142uguje b\u0142\u0119dy. Jest to powi\u0105zane bezpo\u015brednio z problemem na jaki natrafi\u0142em w momencie obs\u0142ugiwania tej komendy. Przy uruchamianiu komend<em> build_runner<\/em>\u00a0dostajemy na Windowsie b\u0142\u0105d z kodem <em>-1073741819<\/em>. Zapytanie si\u0119 wykonuje poprawnie, zwraca jednak b\u0142\u0105d, dlatego ustawi\u0142em error handling na ignorowanie tego jednego b\u0142\u0119du jako hotfix.<\/p>\n<div class=\"code-block sc-exAgwC bECVZf\"><span class=\"prismjs css-1xfvm4v\" data-code-lang=\"dart\" data-ds--code--code-block=\"\"><code class=\"language-dart\"><span class=\"comment linenumber react-syntax-highlighter-line-number\">1<\/span><span class=\"token keyword\">void<\/span> <span class=\"token function\">handleError<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">final<\/span> <span class=\"token keyword\">dynamic<\/span><span class=\"\"> error<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"comment linenumber react-syntax-highlighter-line-number\">2<\/span>  <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"\">error <\/span><span class=\"token operator\">is<\/span> <span class=\"token class-name\">ProcessException<\/span> <span class=\"token operator\">&amp;&amp;<\/span><span class=\"\"> error<\/span><span class=\"token punctuation\">.<\/span><span class=\"\">exitCode <\/span><span class=\"token operator\">==<\/span> <span class=\"token operator\">-<\/span><span class=\"token number\">1073741819<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"comment linenumber react-syntax-highlighter-line-number\">3<\/span>    <span class=\"token comment\">\/\/ do nothing no idea why this happens only with build_runner<\/span><br \/>\n<span class=\"comment linenumber react-syntax-highlighter-line-number\">4<\/span>  <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"comment linenumber react-syntax-highlighter-line-number\">5<\/span>    <span class=\"token keyword\">throw<\/span><span class=\"\"> error<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"comment linenumber react-syntax-highlighter-line-number\">6<\/span>  <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"comment linenumber react-syntax-highlighter-line-number\">7<\/span><span class=\"token punctuation\">}<\/span><\/code><\/span><\/div>\n<p data-renderer-start-pos=\"3308\">Innym b\u0142\u0119dem s\u0105 problemy z uruchomieniem tego samego skryptu zar\u00f3wno na MacOS jak i Windowsie. Wymaga to czasami dodatkowej pracy.<\/p>\n<h3 id=\"Dlaczego-polecam-u\u017cywanie-Grindera?\" data-renderer-start-pos=\"3440\">Dlaczego polecam u\u017cywanie Grindera?<\/h3>\n<p data-renderer-start-pos=\"3477\">Pewnie wielu z was zada\u0142o by mi w tym momencie to proste pytanie &#8211; dlaczego?<\/p>\n<p id=\"Argumenty-za:\" data-renderer-start-pos=\"3555\"><strong>Argumenty za:<\/strong><\/p>\n<p data-renderer-start-pos=\"3570\">Grinder nie jest dla wszystkich &#8211; wiele os\u00f3b preferuje opisywanie w\u0142asnych skrypt\u00f3w oraz alias\u00f3w w domy\u015blnych narz\u0119dziach. Jest jednak kilka zalet korzystania z Grindera ponad zwyk\u0142e skrypty.<\/p>\n<p data-renderer-start-pos=\"3763\">Przede wszystkim, je\u017celi pracujemy w wi\u0119kszym zespole, bardzo korzystne jest posiadanie rozwi\u0105zania kt\u00f3re wiemy \u017ce na 100% b\u0119dzie dzia\u0142a\u0107 tak samo u wszystkich (ignoruj\u0105c wcze\u015bniej wspomniane problemy na MacOS oraz Windows, kt\u00f3re s\u0105 raczej jednorazowe na instalacje). Je\u017celi ju\u017c przejdziemy podstawow\u0105 instalacje narz\u0119dzia, jeste\u015bmy pewni, \u017ce nasz skrypt b\u0119dzie dzia\u0142a\u0107 tak samo dla ka\u017cdej osoby w teamie.<\/p>\n<p data-renderer-start-pos=\"4171\">Pracuje aktualnie w projekcie, kt\u00f3ry u\u017cywa skrypt\u00f3w <em>bash<\/em>\u00a0do pobierania tekst\u00f3w z zewn\u0119trznego serwera i budowania klasy, kt\u00f3ra daje do nich prosty dost\u0119p w kodzie. Rozwi\u0105zanie te dzia\u0142a dobrze. Ma jednak jedn\u0105 wad\u0119 &#8211; instalowanie go trwa. Wymaga on kilku dodatkowych bibliotek, kt\u00f3re trzeba zainstalowa\u0107 osobno dla ka\u017cdego pracownika. Nie licz\u0105c tego, wymaga ona utrzymywania dw\u00f3ch wersji tego samego kodu dla r\u00f3\u017cnych system\u00f3w (ponownie Windows i MacOS, tylko zak\u0142adaj\u0105c, \u017ce kto\u015b tak jak ja preferuje Windowsa).<\/p>\n<p data-renderer-start-pos=\"4685\">\u0141atwo zauwa\u017cy\u0107 \u017ce w tym miejscu mieliby\u015bmy bardzo du\u017cy zysk poprzez u\u017cycie Grindera. Biblioteki zarz\u0105dzane s\u0105 w projekcie przez nasz <em>pubspec.yaml<\/em>. Ka\u017cda wi\u0119c osoba b\u0119dzie mie\u0107 dok\u0142adnie takie biblioteki, jakich potrzebujemy (chyba \u017ce nie uruchomi <em>pub get<\/em>\u00a0ale to raczej nie jest realne). Dodatkowo pozwala nam to pisa\u0107 w naszym ulubionym j\u0119zyku Dart bez potrzeby zajmowania si\u0119 innymi j\u0119zykami. Daje nam to swobod\u0119 w edycji naszych komend oraz nie wymaga od mniej bieg\u0142ych w bash&#8217;u, aby szukali wiedzy w internecie dla ka\u017cdej najprostszej zmiany.<\/p>\n<p id=\"Argumenty-przeciw:\" data-renderer-start-pos=\"5232\"><strong>Argumenty przeciw:<\/strong><\/p>\n<p data-renderer-start-pos=\"5252\">Grinder na pewno na pierwszy rzut oka brzmi dobrze, ale nawet pomijaj\u0105c problemy z implementacj\u0105 dla niekt\u00f3rych mo\u017ce by\u0107 wci\u0105\u017c narz\u0119dziem drugorz\u0119dnym.<\/p>\n<p data-renderer-start-pos=\"5406\">Po pierwsze, osoby kt\u00f3re pracuj\u0105 same lub w ma\u0142ym teamie developerskim prawdopodobnie nie zyskaj\u0105 tak du\u017cej r\u00f3\u017cnicy od skrypt\u00f3w systemowych. Du\u017ca cz\u0119\u015b\u0107 poprzedniego argumentu skupia si\u0119 na sprowadzeniu komend na wsp\u00f3ln\u0105 platform\u0119. Je\u017celi nie posiadamy takich, raczej nie jest to sprawa priorytetowa.<\/p>\n<p data-renderer-start-pos=\"5707\">Drugim argumentem przeciw, mo\u017ce by\u0107 fakt, \u017ce Grinder nie jest natywnym narz\u0119dziem. Jest uruchamiany w konsoli i pozwala wywo\u0142ywa\u0107 komendy systemowe. Nie b\u0119dzie jednak mie\u0107 swobody, jak\u0105 zyskujemy przy pracy z zasobami natywnymi.<\/p>\n<p data-renderer-start-pos=\"5937\">P\u00f3\u0142 argumentem mo\u017ce by\u0107 fakt, \u017ce trzeba definiowa\u0107 Grindera dla ka\u017cdego projektu z osobna. Mo\u017ce to powodowa\u0107 zmiany mi\u0119dzy projektami, kt\u00f3re trzeba rozwi\u0105zywa\u0107. Cz\u0119\u015bciowo problem przenoszenia mi\u0119dzy projektami poprawia nam np Mason, kt\u00f3ry doskonale normalizuje narzut, kt\u00f3ry pozyskujemy poprzez poszerzanie swojego zasobu narz\u0119dzi.<\/p>\n<p data-renderer-start-pos=\"6271\">Ostatnim argumentem, jaki widz\u0119, jest implementacja. Jak wcze\u015bniej wspomnia\u0142em, moja praca z narz\u0119dziem nie oby\u0142a si\u0119 bez problem\u00f3w. Grinder wymaga pracy aby go ustabilizowa\u0107. Prawdopodobnie jest ona mniejsza, ni\u017c instalacja zale\u017cno\u015bci dla skrypt\u00f3w natywnych, jednak na ten moment, dla mnie, wygl\u0105da ta biblioteka bardziej jak fajny bajer, ni\u017c pe\u0142noprawne narz\u0119dzie.<\/p>\n<h3 id=\"Zako\u0144czenie\" data-renderer-start-pos=\"6639\">Zako\u0144czenie<\/h3>\n<p data-renderer-start-pos=\"6652\">Grinder jest narz\u0119dziem, kt\u00f3re mnie zainspirowa\u0142o. Osobi\u015bcie b\u0119d\u0119 stara\u0142 si\u0119 dalej go u\u017cywa\u0107. Wcze\u015bniej u\u017cywa\u0142em ju\u017c nie wspieranej biblioteki Derry do dodawania alias\u00f3w w <em>pubspec.yaml<\/em>, jednak Grinder szybko zaj\u0105\u0142 jej miejsce i wpasowa\u0142 si\u0119 bez problemu. Polecam go osobom, kt\u00f3re pracuj\u0105 w r\u00f3\u017cnych \u015brodowiskach, poniewa\u017c pomimo pierwszych problem\u00f3w ufam, \u017ce da si\u0119 nim zast\u0105pi\u0107 wi\u0119kszo\u015b\u0107 niezrozumia\u0142ych dla wi\u0119kszo\u015bci skrypt\u00f3w.<\/p>\n<p data-renderer-start-pos=\"1522\">\n","protected":false},"excerpt":{"rendered":"<p>Mo\u017cliwe, \u017ce spotkali\u015bcie si\u0119 kiedy\u015b z problemem z build_runner\u2019em. Patrz\u0105c na niego z boku biblioteka jest bardzo przydatna. Ma jednak jedn\u0105 zasadnicz\u0105 wad\u0119, kt\u00f3ra mnie razi, a zwi\u0119\u017ale nazywa si\u0119: flutter pub run build_runner build &#8211;delete-conflicting-outputs. Niekt\u00f3rzy z was pewnie u\u017cywaj\u0105 biblioteki fvm, kt\u00f3ra pozwala zarz\u0105dza\u0107 wersjami Fluttera. Mo\u017ce napotkali\u015bcie te\u017c na problem, w momencie [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":2660,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[60],"tags":[],"class_list":["post-2586","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aktualnosci"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/appvinio.com\/pl\/wp-json\/wp\/v2\/posts\/2586","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/appvinio.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/appvinio.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/appvinio.com\/pl\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/appvinio.com\/pl\/wp-json\/wp\/v2\/comments?post=2586"}],"version-history":[{"count":2,"href":"https:\/\/appvinio.com\/pl\/wp-json\/wp\/v2\/posts\/2586\/revisions"}],"predecessor-version":[{"id":2680,"href":"https:\/\/appvinio.com\/pl\/wp-json\/wp\/v2\/posts\/2586\/revisions\/2680"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/appvinio.com\/pl\/wp-json\/wp\/v2\/media\/2660"}],"wp:attachment":[{"href":"https:\/\/appvinio.com\/pl\/wp-json\/wp\/v2\/media?parent=2586"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/appvinio.com\/pl\/wp-json\/wp\/v2\/categories?post=2586"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/appvinio.com\/pl\/wp-json\/wp\/v2\/tags?post=2586"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}