{"id":2585,"date":"2022-01-26T00:00:00","date_gmt":"2022-01-26T00:00:00","guid":{"rendered":"https:\/\/appvinio.runbyit.com\/https-appvinio-com-pl-aktualnosci-mason-mniej-pracy-wiecej-programowania\/"},"modified":"2023-11-07T14:53:36","modified_gmt":"2023-11-07T14:53:36","slug":"mason-mniej-pracy-wiecej-programowania","status":"publish","type":"post","link":"https:\/\/appvinio.com\/pl\/mason-mniej-pracy-wiecej-programowania\/","title":{"rendered":"Mason &#8211; mniej pracy wi\u0119cej programowania"},"content":{"rendered":"<p data-renderer-start-pos=\"667\">Wielu z was na pewno natrafia na moment kiedy znajdujecie pomys\u0142 na nowy projekt, jednak aby go rozpocz\u0105\u0107 musicie przej\u015b\u0107 przez list\u0119 rzeczy do zrobienia:<\/p>\n<ul class=\"ak-ul\" data-indent-level=\"1\">\n<li>\n<p data-renderer-start-pos=\"825\">doda\u0107 istotne biblioteki kt\u00f3rych u\u017cywacie w ka\u017cdym projekcie,<\/p>\n<\/li>\n<li>\n<p data-renderer-start-pos=\"891\">ustawi\u0107 wszystkie parametry w MaterialApp,<\/p>\n<\/li>\n<li>\n<p data-renderer-start-pos=\"938\">skopiowa\u0107 przydatne widgety,<\/p>\n<\/li>\n<li>\n<p data-renderer-start-pos=\"970\">przygotowa\u0107 globalne ustawienia dla Theme.<\/p>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<div class=\"rich-media-item mediaSingleView-content-wrap image-center sc-eNQAEJ erRsmD sc-jKJlTe gPzUjY\" data-layout=\"center\" data-node-type=\"mediaSingle\">\n<div class=\"sc-ckVGcZ dfSCkP\">\n<div class=\"sc-fOKMvo cxpccT\" data-context-id=\"1642201089\" data-type=\"file\" data-node-type=\"media\" data-width=\"518\" data-height=\"801\" data-id=\"0aa186a7-faf1-4f9a-b83c-14055a40712b\" data-collection=\"contentId-1642201089\" data-file-name=\"b9aPMZPzILdBbv3MUrvhkGOQv2Hfm9tYMVfPyFj1iyU7tYqRz7UcwTChh2WdtMLUZF0GY9g5ezl2Wd31BtptyO-eIMgHwL3-wUoTml6K_rf5VFzbPKYJ01jk0Y0JeroJ4rUOtCL5\" data-file-size=\"25747\" data-file-mime-type=\"image\/png\" data-alt=\"\">\n<div class=\"new-file-experience-wrapper sc-eIHaNI jxbiaU\" data-testid=\"media-card-view\">\n<div class=\"media-file-card-view sc-eTpRJs gnTenK\" data-testid=\"media-file-card-view\" data-test-status=\"complete\" data-test-media-name=\"b9aPMZPzILdBbv3MUrvhkGOQv2Hfm9tYMVfPyFj1iyU7tYqRz7UcwTChh2WdtMLUZF0GY9g5ezl2Wd31BtptyO-eIMgHwL3-wUoTml6K_rf5VFzbPKYJ01jk0Y0JeroJ4rUOtCL5\" data-test-progress=\"1\"><img fetchpriority=\"high\" decoding=\"async\" class=\"size-full wp-image-947 aligncenter\" src=\"https:\/\/appvinio.com\/wp-content\/uploads\/807031b3-e865-473c-bca7-2d3d29ff2a5d.png\" alt=\"\" width=\"518\" height=\"801\" \/><img decoding=\"async\" draggable=\"false\" src=\"blob:https:\/\/appvinio.atlassian.net\/4fcd7aa7-fe27-48f9-91ab-bd9f8e5fd73a#media-blob-url=true&amp;id=0aa186a7-faf1-4f9a-b83c-14055a40712b&amp;collection=contentId-1642201089&amp;contextId=1642201089&amp;mimeType=image%2Fpng&amp;name=b9aPMZPzILdBbv3MUrvhkGOQv2Hfm9tYMVfPyFj1iyU7tYqRz7UcwTChh2WdtMLUZF0GY9g5ezl2Wd31BtptyO-eIMgHwL3-wUoTml6K_rf5VFzbPKYJ01jk0Y0JeroJ4rUOtCL5&amp;size=25747&amp;height=801&amp;width=518&amp;alt=\" alt=\"\" data-testid=\"media-image\" \/><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div data-testid=\"media-file-card-view\" data-test-status=\"complete\" data-test-media-name=\"b9aPMZPzILdBbv3MUrvhkGOQv2Hfm9tYMVfPyFj1iyU7tYqRz7UcwTChh2WdtMLUZF0GY9g5ezl2Wd31BtptyO-eIMgHwL3-wUoTml6K_rf5VFzbPKYJ01jk0Y0JeroJ4rUOtCL5\" data-test-progress=\"1\">\n<p data-renderer-start-pos=\"1019\">Lista dla ka\u017cdego mo\u017ce by\u0107 inna, jednak raczej wszyscy mo\u017cemy si\u0119 zgodzi\u0107, \u017ce jest to sporo <span id=\"622279ca-a470-4e21-8d2a-292c671398ca\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"622279ca-a470-4e21-8d2a-292c671398ca\">roboty. W naszych<\/span> projektach potrafi\u0142o to zabra\u0107 1-2 godzin, nawet po przygotowaniu sobie wszystkiego w osobnym folderze.<\/p>\n<p data-renderer-start-pos=\"1234\">Pewnego razu, przy kt\u00f3rym\u015b z kolei tworzeniu projektu w czasie jednego tygodnia, wpad\u0142em na pomys\u0142, aby upro\u015bci\u0107 sobie \u017cycie i sprawdzi\u0107 sposoby automatycznej <span id=\"766aa9df-5d9e-42a3-89d8-1e60db24a196\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"766aa9df-5d9e-42a3-89d8-1e60db24a196\"><span id=\"33a8e38d-1cb5-40d2-8766-4ff76273cca0\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"33a8e38d-1cb5-40d2-8766-4ff76273cca0\">generacji<\/span><\/span><span id=\"33a8e38d-1cb5-40d2-8766-4ff76273cca0\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"33a8e38d-1cb5-40d2-8766-4ff76273cca0\"> projekt\u00f3w. Pierwsz\u0105<\/span> bibliotek\u0105 jak\u0105 sprawdzi\u0142em by\u0142 `Stageha<span id=\"f3fd033c-3229-44c7-b579-68e2d867d350\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"f3fd033c-3229-44c7-b579-68e2d867d350\">nd`. Niestety, bra<\/span>kowa\u0142o mi w niej sposobu na dodawanie w\u0142asnych template. Jeden z issue przekierowa\u0142 mnie jednak do innej <span id=\"63ea8e64-d962-446f-9a27-5b3cf99c3311\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"63ea8e64-d962-446f-9a27-5b3cf99c3311\">paczki -`Masona`. Pozwala<\/span> ona na definicje w\u0142asnych preset&#8217;\u00f3w dla <span id=\"b30e512a-76ae-4891-a5a8-ca7c2f52461b\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"b30e512a-76ae-4891-a5a8-ca7c2f52461b\">projekt\u00f3w. Wystarczy<\/span> doda\u0107 wszystko do jednego folderu, zdefiniowa\u0107 nazw\u0119 i tyle.<\/p>\n<\/div>\n<h2 id=\"Uwaga\" data-renderer-start-pos=\"1735\">Uwaga<\/h2>\n<p data-testid=\"media-file-card-view\" data-test-status=\"complete\" data-test-media-name=\"b9aPMZPzILdBbv3MUrvhkGOQv2Hfm9tYMVfPyFj1iyU7tYqRz7UcwTChh2WdtMLUZF0GY9g5ezl2Wd31BtptyO-eIMgHwL3-wUoTml6K_rf5VFzbPKYJ01jk0Y0JeroJ4rUOtCL5\" data-test-progress=\"1\">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>w systemie. Wi\u0119cej informacji m.in. w tym issue &#8211; <em><span style=\"text-decoration: underline;\"><span class=\"loader-wrapper\"><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><\/em><\/p>\n<p data-renderer-start-pos=\"1989\">U\u017cywanie tej biblioteki jest wyj\u0105tkowo <span id=\"05e68398-35d7-44f4-b8fc-b565fcbda0e0\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"05e68398-35d7-44f4-b8fc-b565fcbda0e0\">proste. Najtrudniejsza<\/span> cz\u0119\u015b\u0107 to zdefiniowanie w\u0142asnych template. Trzeba przemy\u015ble\u0107 uk\u0142ad plik\u00f3w oraz zmienne, kt\u00f3re s\u0105 nam potrzebne.<\/p>\n<p data-renderer-start-pos=\"2164\">Samo u\u017cywanie biblioteki jest bardzo proste. Wpisujemy komend\u0119 `mason make &lt;nazwa&gt;` i patrzymy jak pliki si\u0119 same przenosz\u0105.<\/p>\n<p data-renderer-start-pos=\"2290\">Nasuwa si\u0119 pytanie &#8211; jak to dzia\u0142a? Ot\u00f3\u017c, nie jest to \u017caden rocket <span id=\"3207add2-276e-4eb4-864f-085aac0b1b7c\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"3207add2-276e-4eb4-864f-085aac0b1b7c\">science. Biblioteka<\/span> u\u017cywa systemu szablon\u00f3w `Mustache`, kt\u00f3ry pozwala nam inject&#8217;owa\u0107 tekst bezpo\u015brednio do plik\u00f3w. `Mason` sam nasze pliki kopiuje, przenosi, skanuje i edytuje.<\/p>\n<p data-renderer-start-pos=\"2536\">Sama biblioteka zawiera kilka funkcji oraz par\u0119 quality of life decyzji, kt\u00f3re maj\u0105 nam u\u0142atwia\u0107 prac\u0119.<br \/>\nJak wcze\u015bniej wspomnia\u0142em, u\u017cywany jest tutaj system szablon\u00f3w `<span id=\"596e7d2a-b243-4ca4-9098-6088fffb6192\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"596e7d2a-b243-4ca4-9098-6088fffb6192\">Mustache`. Pozwala<\/span> nam on wk\u0142ada\u0107 do plik\u00f3w \u201czmienne\u201d, kt\u00f3re potem przy generacji template s\u0105 podmieniane na te, kt\u00f3re mu podamy.<\/p>\n<p data-renderer-start-pos=\"2536\">\/\/Wszelkie nazwy naszej zmiennej s\u0105 podmieniane<\/p>\n<div class=\"rich-media-item mediaSingleView-content-wrap image-center sc-eNQAEJ erRsmD sc-jKJlTe hHcmLy\" data-layout=\"center\" data-node-type=\"mediaSingle\">\n<div class=\"sc-ckVGcZ fAujYy\">\n<div class=\"sc-fOKMvo cxpccT\" data-context-id=\"1642201089\" data-type=\"file\" data-node-type=\"media\" data-width=\"625\" data-height=\"227\" data-id=\"7f3701a0-b7d1-44b2-a1c4-f702c5a2567a\" data-collection=\"contentId-1642201089\" data-file-name=\"vWNOqxmoL4_NO2MNCU86X8WwiIjID8B_M-8kAgXr002Bzf82TfES-KIqX6Y8Nb8um06ZHQsvjT07bMyfmmq2wKPepzFTFzAtYUr8xdXIANo79KEzjQAbHUV-2rdyorcm_oY34ldt\" data-file-size=\"18886\" data-file-mime-type=\"image\/png\" data-alt=\"\">\n<div class=\"new-file-experience-wrapper sc-eIHaNI doGkf\" data-testid=\"media-card-view\"><img decoding=\"async\" class=\"size-full wp-image-949 aligncenter\" src=\"https:\/\/appvinio.com\/wp-content\/uploads\/d40e0cd2-5d31-4ce0-8e0c-4632e001208a.png\" alt=\"\" width=\"625\" height=\"227\" \/><\/div>\n<div data-testid=\"media-card-view\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<div data-testid=\"media-file-card-view\" data-test-status=\"complete\" data-test-media-name=\"b9aPMZPzILdBbv3MUrvhkGOQv2Hfm9tYMVfPyFj1iyU7tYqRz7UcwTChh2WdtMLUZF0GY9g5ezl2Wd31BtptyO-eIMgHwL3-wUoTml6K_rf5VFzbPKYJ01jk0Y0JeroJ4rUOtCL5\" data-test-progress=\"1\">\n<figure id=\"attachment_951\" aria-describedby=\"caption-attachment-951\" style=\"width: 167px\" class=\"wp-caption aligncenter\"><img decoding=\"async\" class=\"wp-image-951 size-full\" src=\"https:\/\/appvinio.com\/wp-content\/uploads\/9b2a3c74-73e6-42c9-9e2d-b76e89ce2ebd.png\" alt=\"\/\/Dzia\u0142a to tak\u017ce w nazwach plik\u00f3w!\" width=\"167\" height=\"75\" \/><figcaption id=\"caption-attachment-951\" class=\"wp-caption-text\">\/\/Dzia\u0142a to tak\u017ce w nazwach plik\u00f3w!<\/figcaption><\/figure>\n<p data-renderer-start-pos=\"2926\">Kod posiada te\u017c mo\u017cliwo\u015b\u0107 generowania <span id=\"bff2fbcd-4b40-4bd9-b13f-e269bd0d8704\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"bff2fbcd-4b40-4bd9-b13f-e269bd0d8704\">warunkowego. Zale\u017cnie<\/span> od podanych zmiennych mo\u017cna decydowa\u0107 czy dana cz\u0119\u015b\u0107 kodu ma si\u0119 wygenerowa\u0107 czy nie. Jest to przydatne w momencie, w kt\u00f3rym chcemy tworzy\u0107 bardziej skomplikowane template, kt\u00f3re maj\u0105 obs\u0142ugiwa\u0107 wiele mo\u017cliwych konfiguracji.<\/p>\n<p data-renderer-start-pos=\"3212\">Jedn\u0105 z istotniejszych rzeczy, kt\u00f3ra do mnie trafi\u0142a to fakt, \u017ce Mason nie wymaga nic od u\u017cytkownika przy generowaniu <span id=\"99ca1249-866e-456d-b72c-d6ed292e93ab\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"99ca1249-866e-456d-b72c-d6ed292e93ab\">projektu. Z pocz\u0105tku<\/span> my\u015bla\u0142em \u017ce trzeba b\u0119dzie za ka\u017cdym razem przenosi\u0107 plik z ustawieniami <span id=\"380cd83b-2a58-4a0f-9d5e-5b128522d396\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"380cd83b-2a58-4a0f-9d5e-5b128522d396\">template. Okaza\u0142o<\/span> si\u0119, \u017ce wystarczy\u00a0po prostu wej\u015b\u0107 w wybran\u0105 lokalizacj\u0119 i wpisa\u0107 jedn\u0105 komend\u0119. Zawdzi\u0119czamy to globalnym ustawieniom dla ca\u0142ego <span id=\"ab1e8254-3d9e-4174-9f89-6d4ea77eb178\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"ab1e8254-3d9e-4174-9f89-6d4ea77eb178\">\u015brodowiska. Zast\u0105pi\u0142y<\/span> one wcze\u015bniejsz\u0105 implementacje, w kt\u00f3rej by\u0142 definiowany plik `yaml` zawieraj\u0105cy informacje o wszystkich dost\u0119pnych `<span id=\"8a014a82-4fce-4c9c-93c6-b69a8db5b8f9\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"8a014a82-4fce-4c9c-93c6-b69a8db5b8f9\">brick\u2019ach`. Mo\u017cna<\/span> by\u0142o go zdefiniowa\u0107 na dole drzewa folder\u00f3w. By\u0142 on jednak odrobin\u0119 niepor\u0119czny.<\/p>\n<p data-renderer-start-pos=\"3809\">Wisienk\u0105 na torcie jest dobre wsparcie dla `<span id=\"d50020db-844c-4b0c-8161-e6a8fc8a9f3a\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"d50020db-844c-4b0c-8161-e6a8fc8a9f3a\">git\u2019a`. Pozwala<\/span> nam ono zdefiniowa\u0107 nasze template i przechowywa\u0107 np. na <span id=\"9f24afa1-a39c-4e36-ae88-02b687cbddb3\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"9f24afa1-a39c-4e36-ae88-02b687cbddb3\">GitHubie. <\/span>Wystarczy u\u017cy\u0107 komendy `mason get`, aby pobra\u0107 wszystkie zmiany, kt\u00f3re pojawi\u0142y si\u0119 na serwerze.<\/p>\n<p data-renderer-start-pos=\"4034\">Jednak pomimo tych wszystkich zalet, `Mason` posiada jedn\u0105, bardzo istotn\u0105, wad\u0119. Nie mo\u017cna u\u017cywa\u0107 go do dodawania cz\u0119\u015bciowych <span id=\"3933f9e9-75b9-4f6b-ab06-b63627207ba3\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"3933f9e9-75b9-4f6b-ab06-b63627207ba3\">plik\u00f3w. Albo<\/span> to tylko ja nie wpad\u0142em jak to <span id=\"b89b20d5-16d9-4faf-b336-822248572366\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"b89b20d5-16d9-4faf-b336-822248572366\">robi\u0107. Jest<\/span> to do\u015b\u0107 istotna funkcja np. w momencie, gdyby\u015bmy chcieli doda\u0107 ca\u0142y feature do naszego <span id=\"8c5395d7-8902-4e97-aee5-2daa3f2c7f7b\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"8c5395d7-8902-4e97-aee5-2daa3f2c7f7b\">projektu. Przyk\u0142adowo <\/span>notyfikacje &#8211; nie mogliby\u015bmy edytowa\u0107 cz\u0119\u015bciowo pliku `pubspec.yaml` i musieliby\u015bmy pami\u0119ta\u0107, aby za ka\u017cdym razem doklei\u0107 wymagane <span id=\"9db80fc6-2af2-4686-8dfc-733015aebf43\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"9db80fc6-2af2-4686-8dfc-733015aebf43\">biblioteki. Albo<\/span> musieliby\u015bmy zdefiniowa\u0107 ten feature, jako cz\u0119\u015b\u0107 g\u0142\u00f3wnego template. Nie jest to kompletny deal breaker dla `<span id=\"a7822a5b-43e4-4411-9465-35bb0cb44c03\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"a7822a5b-43e4-4411-9465-35bb0cb44c03\">Masona`. <\/span>W mojej opinii jest jednak najwi\u0119kszym problemem aktualnej wersji. (Nie wygl\u0105da te\u017c na to aby mia\u0142o to zosta\u0107 zmienione.)<\/p>\n<p data-renderer-start-pos=\"4714\">Uwa\u017cam dodatkowo, \u017ce z dost\u0119pem do narz\u0119dzia generuj\u0105cego za nas wi\u0119kszo\u015b\u0107 pracy, dostajemy dost\u0119p do wi\u0119kszej wolno\u015bci przy tworzeniu <span id=\"e8bd879b-0a2e-4a3f-9093-e19db408cc02\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"e8bd879b-0a2e-4a3f-9093-e19db408cc02\">projekt\u00f3w. S\u0142ysza\u0142em<\/span> <span id=\"e8bd879b-0a2e-4a3f-9093-e19db408cc02\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"e8bd879b-0a2e-4a3f-9093-e19db408cc02\">na przyk\u0142ad<\/span> ju\u017c propozycje, aby u\u017cy\u0107 do\u015b\u0107 interesuj\u0105cej biblioteki `storyboard`, kt\u00f3ra pozwala\u0142aby nam testowa\u0107 widgety w lepszy spos\u00f3b. Zawdzi\u0119czamy to temu, \u017ce nie wp\u0142ywa na nas wi\u0119kszy nak\u0142ad czasu przy tworzeniu tych <span id=\"e1ec8f73-773c-4c6a-9474-7634404c17cd\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"e1ec8f73-773c-4c6a-9474-7634404c17cd\">feature. Tworzenie<\/span> projektu z wbudowanymi, skomplikowanymi narz\u0119dziami diagnostycznymi oraz testuj\u0105cymi trwa w teorii tak samo d\u0142ugo, jak podstawowego \u201chello word\u201d.<\/p>\n<h3 id=\"Przyk\u0142ady-u\u017cycia:\" data-renderer-start-pos=\"5257\">Przyk\u0142ady u\u017cycia:<\/h3>\n<p data-renderer-start-pos=\"5276\">Wszystkie poni\u017csze przyk\u0142ady s\u0105 zawarte w repo na githubie: <span data-inline-card=\"true\" data-card-url=\"https:\/\/github.com\/Fasuh\/mason_testing_ground\"><span class=\"loader-wrapper\"><a class=\"sc-hmzhuo krhyBX\" tabindex=\"0\" role=\"button\" href=\"https:\/\/github.com\/Fasuh\/mason_testing_ground\" data-testid=\"inline-card-resolved-view\"><span class=\"sc-gisBJw guKjte\"><span class=\"sc-ksYbfQ jHwjmi\">GitHub &#8211; Fasuh\/mason_testing_ground<\/span><\/span><\/a><\/span><\/span>.<br \/>\nBrick\u2019i s\u0105 zdefiniowane w folderze `bricks`, po wywo\u0142aniu komend:<\/p>\n<ul class=\"ak-ul\" data-indent-level=\"1\">\n<li>\n<p data-renderer-start-pos=\"5409\">`Mason get`<\/p>\n<\/li>\n<li>\n<p data-renderer-start-pos=\"5424\">`Mason list`<\/p>\n<\/li>\n<\/ul>\n<p data-renderer-start-pos=\"5440\">Powinny wy\u015bwietli\u0107 si\u0119 nam 3 bricki:<\/p>\n<ul class=\"ak-ul\" data-indent-level=\"1\">\n<li>\n<p data-renderer-start-pos=\"5480\">authorization<\/p>\n<\/li>\n<li>\n<p data-renderer-start-pos=\"5497\">feature<\/p>\n<\/li>\n<li>\n<p data-renderer-start-pos=\"5508\">flutter_clean_architecture<\/p>\n<\/li>\n<\/ul>\n<h3 id=\"Test-case-1---Inicjalizacja-ca\u0142ego-projektu:\" data-renderer-start-pos=\"5538\">Test case 1 &#8211; Inicjalizacja ca\u0142ego projektu:<\/h3>\n<p data-renderer-start-pos=\"5584\">Najbardziej podstawowy <span id=\"ddbd5177-0b29-4daa-aa73-ae363017c85b\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"ddbd5177-0b29-4daa-aa73-ae363017c85b\">case &#8211; definiujemy<\/span> wszystko, co chcemy mie\u0107 utworzone w projekcie. W naszym repo ten przyk\u0142ad jest nazwany `<span id=\"0e3d3784-f5bc-4155-87c7-8951e541dd1a\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"0e3d3784-f5bc-4155-87c7-8951e541dd1a\">flutter_clean_architecture`<\/span>.<br \/>\nPo wywo\u0142aniu komendy mo\u017cemy zobaczy\u0107 jedn\u0105, z pocz\u0105tku mo\u017ce dziwn\u0105, rzecz. Mason pyta nas o zmienn\u0105 o nazwie `<span id=\"edead2ee-f58d-43fc-ab57-04fa2f43b07c\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"edead2ee-f58d-43fc-ab57-04fa2f43b07c\">project_name`. Jest<\/span> to spowodowane tym, \u017ce biblioteka nie posiada informacji o <span id=\"5ffad1f2-0772-4479-9232-de83d134336a\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"5ffad1f2-0772-4479-9232-de83d134336a\">projekcie. W dw\u00f3ch<\/span> miejscach u\u017cywamy tej nazwy:<\/p>\n<ol class=\"ak-ol\" data-indent-level=\"1\">\n<li>\n<p data-renderer-start-pos=\"5985\">Linki import\u00f3w s\u0105 zdefiniowane po `package`, wi\u0119c ka\u017cdy import wewn\u0119trzny w projekcie posiada nazw\u0119 projektu. Mo\u017cna pomin\u0105\u0107 ten krok u\u017cywaj\u0105c importowania relatywnego<\/p>\n<\/li>\n<li>\n<p data-renderer-start-pos=\"6155\">Przy generowaniu `pubspec.yaml` musimy w nim zdefiniowa\u0107 nazw\u0119 projektu. Raczej ci\u0119\u017ckie jest to do pomini\u0119cia w sensowny spos\u00f3b<\/p>\n<\/li>\n<\/ol>\n<p data-renderer-start-pos=\"6286\">Poza tym, biblioteka dzia\u0142a do\u015b\u0107 <span id=\"1334f109-ed81-47b5-834e-220cff40dfaf\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"1334f109-ed81-47b5-834e-220cff40dfaf\">sprawnie. Generuje<\/span> wszystko, przy wywo\u0142aniu komendy `flutter pub <span id=\"db9dfb94-e9ca-4279-82e0-ae93f509685d\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"db9dfb94-e9ca-4279-82e0-ae93f509685d\">get`. Nie powinni\u015bmy<\/span> mie\u0107 \u017cadnych b\u0142\u0119d\u00f3w. Przenios\u0142y si\u0119 nasze bloc\u2019e, widgety, podstawowe biblioteki oraz flavory.<\/p>\n<h3 id=\"Test-case-2---Inicjalizacja-pojedynczego-modu\u0142u\" data-renderer-start-pos=\"6501\">Test case 2 &#8211; Inicjalizacja pojedynczego modu\u0142u<\/h3>\n<p data-renderer-start-pos=\"6550\">Jedn\u0105 z najbardziej po\u017c\u0105danych feature w naszej firmie jest mo\u017cliwo\u015b\u0107 generowania ca\u0142ego modu\u0142u na<span id=\"0e7ced87-20c3-4298-9675-781ebf6e65bb\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"0e7ced87-20c3-4298-9675-781ebf6e65bb\"> raz. W naszej<\/span> architekturze mamy standardowy podzia\u0142 na `data`, `domain`, oraz `<span id=\"abcd49b5-998d-402b-a8b9-361c3dd279f4\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"abcd49b5-998d-402b-a8b9-361c3dd279f4\">presentation`. Tworzenie <\/span>wszystkich plik\u00f3w zabiera troch\u0119 <span id=\"b7cfb476-3887-41f7-a336-f2d3db8ab982\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"b7cfb476-3887-41f7-a336-f2d3db8ab982\">czasu. Nie<\/span> jest to jaka\u015b bardzo skomplikowana praca, ale nie mamy za du\u017co ch\u0119tnych do jej manualnego robienia. Z pocz\u0105tku u\u017cywali\u015bmy plugina do AndroidStudio, kt\u00f3ry robi\u0142 to za <span id=\"019172d3-b006-4152-b52c-6e425623e668\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"019172d3-b006-4152-b52c-6e425623e668\">nas.<\/span> Szybko <span id=\"019172d3-b006-4152-b52c-6e425623e668\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"019172d3-b006-4152-b52c-6e425623e668\">jednak<\/span> natrafili\u015bmy na problem przy zmianie wersji AS, nasz plugin przestawa\u0142 dzia\u0142a\u0107. Postanowili\u015bmy u\u017cy\u0107 w jego miejsce nowo nabytego Mason\u2019a. W projekcie na githubie jest to brick o nazwie `<span id=\"74e82f0b-5b78-4fcb-95f0-b4a53e67276c\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"74e82f0b-5b78-4fcb-95f0-b4a53e67276c\">feature`. Po<\/span> jego wywo\u0142aniu dostajemy pro\u015bb\u0119 o wype\u0142nienie zmiennej odpowiadaj\u0105cej za nazw\u0119 modu\u0142u. W tym przypadku zastosowali\u015bmy relatywne <span id=\"d886eec2-a638-4266-836c-8eed0516e890\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"d886eec2-a638-4266-836c-8eed0516e890\">importy. Jak<\/span> wida\u0107 dzia\u0142aj\u0105 one <span id=\"9d7cdba7-5681-4577-b4e0-1471835ab841\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"9d7cdba7-5681-4577-b4e0-1471835ab841\">dobrze. Jest<\/span> to jednak kwestia osobistej preferencji (ja osobi\u015bcie uwa\u017cam \u017ce nie wygl\u0105daj\u0105 elegancko).<\/p>\n<h3 id=\"Test-case-3---Inicjalizacja-specyficznego-modu\u0142u---Autoryzacja\" data-renderer-start-pos=\"7446\">Test case 3 &#8211; Inicjalizacja specyficznego modu\u0142u &#8211; Autoryzacja<\/h3>\n<p data-renderer-start-pos=\"7510\">Prawdopodobnie to, co interesuje wi\u0119kszo\u015b\u0107 z nas to wyobra\u017cenie tworzenia aplikacji \u201cz klock\u00f3w\u201d wywo\u0142uj\u0105c tylko komendy Mason\u2019a w celu dodania modu\u0142\u00f3w i dorabiania jedynie ekran\u00f3w. Nie jest to jednak tak oczywisty case. Zapraszam do spojrzenia na Brick o nazwie `authorization`. <span id=\"5f22c259-abe2-44fb-900d-970af7442fc5\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"5f22c259-abe2-44fb-900d-970af7442fc5\">Przy jego generowaniu <\/span>u\u017cywamy ponownie nazwy projektu. Poza tym nie wymagamy nic.<\/p>\n<p data-renderer-start-pos=\"7873\">Od razu mo\u017cemy zauwa\u017cy\u0107, \u017ce widzimy kilka b\u0142\u0119d\u00f3w w projekcie. W tym miejscu odrobin\u0119 uwypuklaj\u0105 si\u0119 problemy z <span id=\"3dc27357-5b77-4869-b556-d944ba70fc14\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"3dc27357-5b77-4869-b556-d944ba70fc14\">bibliotek\u0105. Nie jeste\u015bmy<\/span> w stanie edytowa\u0107 plik\u00f3w tak aby, nie straci\u0107 ich aktualnego stanu, b\u0142\u0119dy, kt\u00f3re widzimy wchodz\u0105 z naszego sposobu error handlingu. Dodajemy b\u0142\u0119dy w osobnym pliku. Nie jest to du\u017co nadmiarowej roboty. Problem ten mo\u017ce jednak bardzo szybko eskalowa\u0107.<\/p>\n<\/div>\n<div data-testid=\"media-file-card-view\" data-test-status=\"complete\" data-test-media-name=\"b9aPMZPzILdBbv3MUrvhkGOQv2Hfm9tYMVfPyFj1iyU7tYqRz7UcwTChh2WdtMLUZF0GY9g5ezl2Wd31BtptyO-eIMgHwL3-wUoTml6K_rf5VFzbPKYJ01jk0Y0JeroJ4rUOtCL5\" data-test-progress=\"1\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-953\" src=\"https:\/\/appvinio.com\/wp-content\/uploads\/c2cb5f05-dc6e-4a13-84eb-d307d07fe631.png\" alt=\"\" width=\"529\" height=\"404\" data-wp-editing=\"1\" \/><\/div>\n<div data-testid=\"media-file-card-view\" data-test-status=\"complete\" data-test-media-name=\"b9aPMZPzILdBbv3MUrvhkGOQv2Hfm9tYMVfPyFj1iyU7tYqRz7UcwTChh2WdtMLUZF0GY9g5ezl2Wd31BtptyO-eIMgHwL3-wUoTml6K_rf5VFzbPKYJ01jk0Y0JeroJ4rUOtCL5\" data-test-progress=\"1\">\n<p data-renderer-start-pos=\"8283\">Mimo tego, jest to szybszy spos\u00f3b na implementacj\u0119 popularnych modu\u0142\u00f3w np. Autoryzacji lub Push Notifications.<\/p>\n<h3 id=\"Mo\u017cliwe-pytania\" data-renderer-start-pos=\"8395\">Mo\u017cliwe pytania<\/h3>\n<ol class=\"ak-ol\" data-indent-level=\"1\">\n<li>\n<p data-renderer-start-pos=\"8414\">Czy jest mo\u017cliwe budowanie aplikacji, \u201cjak z klock\u00f3w\u201d? &#8211; Uwa\u017cam \u017ce jest to wykonalne na trzy sposoby:<\/p>\n<ol class=\"ak-ol\" data-indent-level=\"2\">\n<li>\n<p data-renderer-start-pos=\"8519\">Zdefiniowanie brick\u2019\u00f3w w taki spos\u00f3b, \u017ce nie wymagaj\u0105 one zewn\u0119trznych zale\u017cno\u015bci (np b\u0142\u0119d\u00f3w). Jest to do\u015b\u0107 limituj\u0105ce rozwi\u0105zanie. Wymaga konkretnego podej\u015bcia i mo\u017ce ostatecznie bardzo nas limitowa\u0107.<\/p>\n<\/li>\n<li>\n<p data-renderer-start-pos=\"8724\">U\u017cycie dodatkowego <span id=\"551ecf0e-d4ce-4654-8feb-32ef0a58497f\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"551ecf0e-d4ce-4654-8feb-32ef0a58497f\">narz\u0119dzia. W teorii<\/span> mo\u017cliwe jest, aby u\u017cy\u0107 dodatkowej biblioteki (np `Grinder`), kt\u00f3ra wywo\u0142ywa\u0142a by komendy masona, edytowa\u0142a pliki,\u00a0 generowa\u0142a model, oraz instalowa\u0142a biblioteki w `pubspec.yaml`. Ci\u0119\u017cko mi okre\u015bli\u0107 poziom skomplikowania takiej <span id=\"830c0de2-ac96-4698-a91a-769aa0ca8b96\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"830c0de2-ac96-4698-a91a-769aa0ca8b96\">implementacji. Zdaje <\/span>si\u0119 ona jednak mo\u017cliwa.<\/p>\n<\/li>\n<li>\n<p data-renderer-start-pos=\"9038\">Definiowanie modu\u0142\u00f3w w g\u0142\u00f3wnym template ca\u0142ego <span id=\"a8a5252c-7d95-445b-b8e4-1a00384629f4\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"a8a5252c-7d95-445b-b8e4-1a00384629f4\">projektu. Tworzyliby\u015bmy<\/span> wszystko za pomoc\u0105 blok\u00f3w <span id=\"cecd6fc6-71b9-44d3-b154-7ac71973897e\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"cecd6fc6-71b9-44d3-b154-7ac71973897e\">warunkowych. Pozwoli\u0142o<\/span> by nam to doda\u0107 wszystko na <span id=\"a9028396-9083-4065-9967-c309534bdf1b\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"a9028396-9083-4065-9967-c309534bdf1b\">raz. Minusem<\/span> tego rozwi\u0105zania jest limitacja do dodawania modu\u0142\u00f3w tylko przy tworzeniu projektu.<\/p>\n<p data-renderer-start-pos=\"9284\">Poza tymi sposobami mo\u017cemy oczywi\u015bcie te\u017c po prostu wykorzysta\u0107 cz\u0119\u015bciow\u0105 generacje, i manualnie dodawa\u0107 wszystkie zale\u017cno\u015bci. Jest to w mojej opinii najlepsze z obu \u015bwiat\u00f3w.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p data-renderer-start-pos=\"9464\">Ile roboty mo\u017cna pomin\u0105\u0107 w ten spos\u00f3b? &#8211; Na naszym przyk\u0142adzie mog\u0119 powiedzie\u0107, \u017ce od po\u0142owy do ca\u0142ego dnia, w zale\u017cno\u015bci od projektu i architektury, mo\u017ce skr\u00f3ci\u0107 si\u0119 nawet do 30 minut.<\/p>\n<\/li>\n<li>\n<p data-renderer-start-pos=\"9653\">W jaki spos\u00f3b mo\u017cna by u\u017cy\u0107 Mason\u2019a z innymi narz\u0119dziami? &#8211; Powy\u017cej wspomnia\u0142em, \u017ce mo\u017cna by utworzy\u0107 sie\u0107 narz\u0119dzi z Grinder\u2019a oraz <span id=\"7dbef369-af1e-4b00-8fe3-79fe33033677\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"7dbef369-af1e-4b00-8fe3-79fe33033677\">Mason\u2019a. Jest<\/span> to tylko jeden przyk\u0142ad jak mo\u017cna by u\u017cy\u0107 tej biblioteki do przyspieszenia naszej pracy. Wszystko dzi\u0119ki prostej budowie tej biblioteki.<\/p>\n<\/li>\n<\/ol>\n<p data-renderer-start-pos=\"9940\">Ostatni\u0105 sekcj\u0119 chcia\u0142em przeznaczy\u0107 na lekki shout out dla autora <span id=\"065be3ba-68d8-4d52-9c3f-e79cb6825001\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"065be3ba-68d8-4d52-9c3f-e79cb6825001\">biblioteki. Jej<\/span> \u017cywotno\u015b\u0107 wydaje si\u0119 bardzo dobra, dostajemy cz\u0119ste update. Bardzo spodoba\u0142a mi si\u0119 sytuacja, kiedy zada\u0142em pytanie w `issue` odno\u015bnie niedzia\u0142aj\u0105cej integracji z <span id=\"93891755-ced1-4a7e-ae19-4b8e64cd77a1\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"93891755-ced1-4a7e-ae19-4b8e64cd77a1\">windowsem. Nie <\/span>do\u015b\u0107, \u017ce dosta\u0142em odpowied\u017a w przeci\u0105gu kilku godzin, to jeszcze tego samego dnia integracja zosta\u0142a przerobiona na now\u0105, dzia\u0142aj\u0105c\u0105.<\/p>\n<p data-renderer-start-pos=\"10336\">Wydaje mi si\u0119, \u017ce Mason mo\u017ce w przysz\u0142o\u015bci zosta\u0107 jednym z podstawowych narz\u0119dzi programist\u00f3w Fluttera<span id=\"808cfc40-e3ef-4be0-8228-ba34bc25dda1\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"808cfc40-e3ef-4be0-8228-ba34bc25dda1\">,<\/span> zaraz obok FVM czy <span id=\"45d574dd-1111-4983-ac21-a876d52c0a4d\" data-renderer-mark=\"true\" data-mark-type=\"annotation\" data-mark-annotation-type=\"inlineComment\" data-id=\"45d574dd-1111-4983-ac21-a876d52c0a4d\">build_runner\u2019a. Polecam<\/span> wi\u0119c da\u0107 jej szans\u0119 i zdefiniowa\u0107 w\u0142asne template!<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Wielu z was na pewno natrafia na moment kiedy znajdujecie pomys\u0142 na nowy projekt, jednak aby go rozpocz\u0105\u0107 musicie przej\u015b\u0107 przez list\u0119 rzeczy do zrobienia: doda\u0107 istotne biblioteki kt\u00f3rych u\u017cywacie w ka\u017cdym projekcie, ustawi\u0107 wszystkie parametry w MaterialApp, skopiowa\u0107 przydatne widgety, przygotowa\u0107 globalne ustawienia dla Theme. &nbsp; &nbsp; Lista dla ka\u017cdego mo\u017ce by\u0107 inna, jednak [&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-2585","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\/2585","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=2585"}],"version-history":[{"count":1,"href":"https:\/\/appvinio.com\/pl\/wp-json\/wp\/v2\/posts\/2585\/revisions"}],"predecessor-version":[{"id":2605,"href":"https:\/\/appvinio.com\/pl\/wp-json\/wp\/v2\/posts\/2585\/revisions\/2605"}],"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=2585"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/appvinio.com\/pl\/wp-json\/wp\/v2\/categories?post=2585"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/appvinio.com\/pl\/wp-json\/wp\/v2\/tags?post=2585"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}