Stwierdziłem, że zamiast dawać komentarz do komentarza tomaszk-poz pod wpisem Optymalizacja npm install – Część 2 udostępnię tą odpowiedź jako post – ze względu chociażby na jej długość :)

Oficjalny komentarz brzmiał tak:

by tomaszk-poz

W moim projekcie jest 2MB źródeł (c#,js,scss, grafika) a po skonfigurowaniu gulpa do konwersji scss do css npm naściągał 30MB plików, 8170 plików i 2003 folderów. Do tego musiałem się nagimnastykować, żeby pasował node-sass (kombinacje install/uninstall, rebuild), bo nie chcałem z githubu ściągać binarki (licho wie jak z wirusami).

Pliki nie mogą być współdzielone, wszystko musi lecieć do node_modules. Zależności się powielają, w katalogach zalega mnóstwo plików (testy, źródła w C, js, yml). Spodziewałem się kilku plików a nie śmietnika.

Bower też nie lepszy – w nuget zdarzają się świeższe pakiety niż w bower (choćby underscore). Do tego doliczmy bezsens (podobnie jak npm) ściągania wszystkich plików dla jednego rozwiązania zamiast (tak jak to zrobiono w nuget) js z ew. css.

Sprawdziłem –no-optional i niestety to samo 40MB zajętego dysku/8177 plików, żeby być nowoczesnym i iść z duchem czasu (dla jednej funkcjonalności przy kompilowaniu!). Toż to 1/20 ilości plików w moim windows 10 :-D

Nie pomyślałeś nad rozwiązaniem ramdysk? Ram jest tani, pamięć szybka, zaś dyski SSD nie lubią małych plików, mają słabą wydajność przy takich plikach (widać to w testach IO4KB).
Spakowane archiwum node_modules na dany projekt można trzymać na ssd, zrobić z tego SHA1 i wynik zapisywać do repo. Przed buildem po SHA1 poszukać w magazynie (czy nawet redisie ;-) ) i rozpakować do ramu ew. cały zip trzymać w repo i rozpakowywać. Gdy zawartość node_modules sie nie zmienia, git nie robi kopii do nowych commitów tylko linkuje.

Całość dla mnie ponurego obrazu dopełnia słaba dokumentacja modułów, porzucanie projektów (np. takana – fajnie się zapowiadała, po windowsem problem, od roku na githubie brak akcji)
Moim zdaniem trzeba być ostrożnym z nodejs i npm.

Microsoft idzie w tę głupią modę, w VS2015 w WebEssentials wyrzucono cześć funkcjonalności, sugerując wykorzystanie gulpa, tylko, że jego obsługa lekko kuleje (np. w źródle nie wskazuje błedów w pliku źródłowym).
Moim zdaniem MS właśnie powinien włączyć stare WebEssentials do VS, kto to słyszał, żeby niezłe IDE także do JS domyślnie nie miało konwersji js/scss i innych operacji.

Sorki, musiałem się zastanowić jak Ci odpowiedzieć na Twój komentarz bo poruszyłeś w nim kilka kwestii jak i musiałem na problem spojrzeć z kilku punktów widzenia – bo jakbym był czystym programistą ruby czy też cały czas siedział na innych platformach to raczej bym nie zrozumiał trochę komentarza :) Ale jako użytkownik windows, wiem o co Ci chodzi i z czym masz problem – przynajmniej mi się tak to wydaje.

Spróbowałem się tutaj pogrupować:

Oraz pytanie ogólnie czy nie lepiej by było to zrobić z wykorzystaniem ramdysk i kluczem SHA1 – różne opcje.

Zacznę od problemów które wymieniłeś i spróbuje na nie wszystkie odpowiedzieć po kolei. Jednak pragnę zaznaczyć :) npm nie jest idealnym rozwiązaniem, ma swoje problemy. Ale też nie jest złym rozwiązaniem i jest znacznie lepszym niż nuget pod względem wszystkiego – ot tworzenia paczek po ich instalację. NuGet sam w sobie ma mas

Wszystko musi znajdować się w node_modules

Tak, tak działa i tak został zaprojektowany npm. Nuget można oszukać, ale wtedy zaczynasz mieć per komputer per projekt ustawienia które trafiają do repo, bo plik z informacją o paczkach trzeba wrzucać. Jest to konfigurowalne z poziomu ustawień nuget.

W node_modules zaś masz swobodę i dostępne wszystkie systemowe narzędzia o czym będzie w Części 3. To znaczy, co możesz zrobić by folder niby istniał a nie istniał. Ale jak piszę dam na to odp w Części 3.

Plusem tego, że to się znajduje w jednym folderze jest taki, że łatwo tym zarządzać pod względem projektu. Do tego też dość łatwo się czyści takie projekty pozostawiając jedynie kod źródłowy.

Jak dla mnie, osobiście posiadanie wszystkich zależności w jednym miejscu jest super, bo jestem wstanie tym zarządzać. Nikt mi nie zrobi więcej linków do DLLek które są budowane przez projekt w innej gałęzi TFS. A tak ludzie robili bo się dało :) Więc tutaj jest to po prostu dobrze rozwiązane – proste rozwiązanie które śmiga.

Oczywiście, w Bower da się określić lokalizację ściąganych plików itp., jednak, to jest różnica – strona kliencka i strona serwerowa i dla mnie to ma znaczenie osobiście. Zaś node_modules jest i jest imo ok, mogliby dać możliwość zmiany miejsca instalacji ale znów, nie ma sensu bo da się to zrobić inaczej :) Do tego, dzięki temu, że coś jest w node_modules, pewne rzeczy mogą działać na zasadzie konwencji. A to już jest super fajne :) w razie co, może jak naprawdę chcesz, przydać Ci się komenda npm link – jednak trochę zachodu ona wymaga, część 3 pokarze jak to zrobić szybciej.

Ogólnie, to co jest w node_modules, Cię nie interesuje i interesować nie powinno. To co powinno Cię interesować to czy masz paczkę wykonującą twój kod. Jak Cię interesuje tylko to co chcesz, to nie znam takich technologii która by to dostarczała z nuget włącznie. Bo jak nie chcę nic dla .NET Framework 3.5, nie chcę by pliki statyczne były instalowane w predefiniowanych miejscach – paczka decyduje gdzie, więc wiesz :) nigdzie nie jest pięknie :)

Na koniec, trochę więcej o decyzji npm dlaczego tak a nie inaczej można przeczytać w FAQ: „node_modules” is the name of my deity’s arch-rival, and a Forbidden Word in my religion. Can I configure npm to use a different folder? :)

Liczba plików instalowanych przez npm

Node.js jest serwerem w którym pisze się w JavaScript. Aktualnie nie ma kompilatora chyba takiego co by zrobił binarkę z JavaScript (zaznaczam chyba bo świat jest porąbany), a co to znaczy? To, że jakoś aplikację trzeba móc napisać, a jak napisać to nie w jednym niezrozumiałym pliku ale w kilku tak by się dało to odczytać. Teraz to czy paczka będzie zawierała wszystko czy tylko build to już jest uzależnione od Twórcy paczek. Niezależnie od tego tak czy siak będzie to przynajmniej kilka plików.

To chyba tłumaczy trochę sprawy związane z liczbą plików i dlaczego ich jest aż tyle, ale czy jest ich jest aż tyle, żeby to stanowiło problem? Nie wiem. Mi to nie przeszkadza bo dla mnie node_modules to katalog do którego nie zaglądam bo i nie mam po co.

Liczba paczek instalowanych przez npm

Tutaj jest to dość jasne jak się spojrzy na problemy jakie miało jQuery. Nagle dostawało się super duży plik, z którego jedyną rzeczą jaką korzystaliśmy to selektory. W jQuery 2.0 to już zostało naprawione poprzez osobny projekt. To samo tyczy się wielu innych rzeczy. Dla przykładu czy by mieć event na załadowanie DOM potrzebny jest nam jQuery? Czy wystarczy coś super małego, zwinnego co robi tylko to?

Dla mnie odpowiedź jest prosta, nie potrzebuje jQuery i wolę ten mały przyjemny tool DomReady.

Teraz więc, npm posiada wiele paczek które są małe i są odpowiedzialne za określone rzeczy, odpalenie aplikacji, przesłanie eventu itp. Dzięki czemu masę programistów nie musi tego pisać od nowa. Tak naprawdę większość nie musi. Co jest niesamowicie dużym plusem. Stąd też liczba instalowanych paczek. Do tego, tutaj zależności są paczką, nie są DLLką instalowaną jak .NET Framework. Tutaj wszystko jest paczką i ma to ręce i nogi jak się pomyśli wszystkich platformach na których to jest dostępne.

Liczba powielonych zależności instalowanych przez npm

To się zmieniło w wersji 3.0:

Flat, flat, flat!

Your dependencies will now be installed maximally flat. Insofar as is possible, all of your dependencies, and their dependencies, and THEIR dependencies will be installed in your project’s node_modules folder with no nesting. You’ll only see modules nested underneath one another when two (or more) modules have conflicting dependencies.

Rozmiar na dysku

Tutaj jest mi bardzo ciężko się odnieść, gdyż:

  • VS 2015 -> 10GB?
  • .NET Framework -> 300MB?
  • Plus dla ~80 (u mnie w projekcie) paczek nuget -> 200MB

Więc ciężko mówić o jakiś 40MB tutaj. Oczywiście pomijając środowisko, 40MB to też nie dużo kiedy przestrzeń jest tania. Mnie osobiście by to nie przeszkadzało, w szczególności iż jak pisałem wcześniej – nie interesuje mnie to co się dzieje w node_modules. Do tego ja bym tego nigdzie nie checkinował. Ma to swoje podłoże w tym, że muszę wiedzieć czy projekt zadziała mi wszędzie gdzie trzeba – nie wtedy kiedy mam node_modules w repozytorium, bo może a nóż ktoś wpadł na genialny pomysł i samemu coś tam zaktualizował? To wtedy jak będzie jak pójdziemy na staginig czy live env?

Więc jest to jedynie problem na moim dysku w chwili kiedy pracuje nad projektem. Lub dokładnie, może to być problem tylko i wyłącznie wtedy. Przynajmniej takie mam odczucia.

Konfiguracja tego wszystkiego by to działało tak jak chcesz

No, tutaj nie wiem czy chodzi o Gulp/Grunt i pisanie tasków, czy ogólnie by wszystko śmigało po zainstalowaniu paczek?

Przykład SASS będzie opisany poniżej, więc tutaj ciężko mi się do czegokolwiek odnieść, mogę zaś napisać dwa zdania o Gulp i Grunt.

Są to dla mnie dwa super bardzo zajefajne narzędzia, których brak w .NET odczuwam od lat. MS BUILD jest… istnieje ok, i nie będę się inaczej na jego temat wyrażał. Gdybym miał napisać coś i skonfigurować to z wykorzystaniem MS BUILD to bym sobie krakersami żyły pociął. Modułowość grunta i gulpa jest super, można za pomocą praktyki oczywiście napisać bardzo fajne, przejrzyste i praktyczne taski które będą robiły wszystko to co chcemy jak nie więcej. Czegoś takiego nigdy nie udałoby się uzyskać w rozsądnym czasie w Visual Studio.

SASS – rozdzieliłem, bo to special case

Dlaczego SASS jest special case? Bo SASS zawsze był Ruby, od 2012 roku trwają pracę na libSass – kompilatorze w C. By to skompilować pod Windows trzeba się dalej namęczyć. Ale chyba mniej niż by mieć w pełni działający Ruby. Czyja to wina? Ogólnie nikt się Windowsem nie przejmował z chłopaków którzy pisali tego typu rzeczy. Dlaczego? Bo kto by pomyślał, że ktoś kiedyś zacznie używać command line w windows? Nawet MS w to nie wierzyło, dlatego przez tyle lat zaniedbywali command line.

Ale wracając, z kompilacją są problemy a by Ci libSass działał, to musisz go skompilować. Kropka. Inną opcją to jest to co on robi w trakcie lub po instalacji – ściąga Ci binakrę. Ale to kwestia wirusów i do tego wrócimy w osobnym punkcie.

Bower posiada starsze paczki niż nuget

Tutaj mnie zatkałeś. Aż musiałem pogrzebać, zrobiłem parę testów na kilku paczkach. Na przykład underscore i wychodzi na to, że nuget był w plecy jeszcze wczoraj (dzisiaj nie wiem). W sensie, częściej się spotykam z tym, że nuget czegoś nie ma lub nie jest zaktualizowany niż bower.

Do tego, nuget wymaga ode mnie akceptacji narzuconej konwencji przez autora paczki lub przez MS. Czego nie znoszę po stronie klienckiej. Nie mam folderu Scripts u siebie, mam Content/js/lib. Wszystkie paczki nuget są u mnie następnie ręcznie kopiowane w odpowiednie miejsce. Czyli coś czego nie lubię baaardzo robić. Aktualizacja też do najlepszych nie należy.

Do tego jak się doda statyczne pliki i TFS to problemy gwarantowane, gdyż aktualizacja paczki ze statycznymi plikami traktowana jest jako operacja USUNIĘCIA pliku i wgrania nowego. Zamiast AKTUALIZACJI i usunięcia tych których nie ma w porównaniu z wcześniejszą paczką. Dlaczego o tym piszę? Bo jak masz 100 plików statycznych w nuget, i masz TFS to dostaniesz 100 razy modal window mówiący, że na pliku jest operacja usuń a ty chcesz to utworzyć czy jakoś tak.

Dla mnie tutaj znów nie ma porównania pomiędzy tym co oferuje nuget a co bower. Nuget może być dla dllek i niech tak zostanie. Ale od strony klienckiej nigdy nie powinien istnieć bo ma za dużo problemów z tym wszystkim.

Jeszcze jeden bardzo ważny problem nuget a który rozwiązuje Bower. Nuget wymaga ode mnie posiadania i checkinowania plików przez niego zainstalowanych. Bower zaś nie. Bower znów jest u mnie lokalnie a nie jest w repozytorium. Oczywiście, podobnie jak z npm, mogli by ludzie więcej uwagi przykładać do budowania paczek, by to miało ręce i nogi a nie było dumpem wszystkiego z projektu.

Problemy open source i opuszczania projektów

To jest ogólnie problem Open Source i na to się nic nie da zrobić. Tak samo jak niektóre firmy tak i tutaj, powstają repozytoria duchy. Plusem jest to (w zależności od licencji), że kod jest dostępny i możemy coś z nim zrobić. Jesteśmy wstanie coś naprawić. Albo sami coś nowego napisać.

Przynajmniej jest opcja. Bo w VS to albo coś jest, albo naprawdę mamy ciężki orzech do zgryzienia bo nie tylko musimy napisać coś co będzie nam coś robiło, ale także zastanowić się nad typem rozszerzenia, co i jak będziemy to robić z UI i co ja muszę dopisać do VS by mi to śmigało.

Zaś paczka która działa dla VS 2010|2 nie koniecznie będzie i na pewno bez re-buildu nie będzie działać na innych VSach. Do tego kodu przeważnie nie ma, a jedynym sposobem kontaktu z programistą jest forum pod rozszerzeniem.

To samo tyczy się paczek nuget.

Ale tak, problem istnieje i istnieć będzie, pytanie czy to naprawdę problem czy feature? Komuś się kiedyś chciało coś napisać, teraz mu się nie chce albo nie ma już czasu, albo może zginął w wypadku samochodowym? Nie wiadomo. Ale masz dostęp do kodu, możesz coś zrobić.

Do tego, przy wyborze paczek, warto jednak zachować jakiś standard wyboru:

  • Musi posiadać plik ReadMe
  • Musi posiadać repozytorium
  • Musi być aktywne w ciągu ostatnich X dni/miesięcy/lat (pytanie czy projekt wymaga aktywności czy może już można spocząć na laurach?)
  • Ile osób to pobiera, ile jest issues?

Ogólnie bardzo fajnie to pokazane jest w Understending NPM – warto się zastosować do takich zasad wszędzie – bower, npm, nuget etc.

WebEssentials było lepsze i MS powinno to przywrócić

Tutaj mógłbym pisać i pisać, więc skrócę to do punktów:

  • WE 2012 nie miał sass, i korzystał z lessc dla LESS i to jeszcze opakowane w VBScript, który miał kłopot z polskim kodowaniem znakowym w trakcie odczytywania plików. Do tego wprowadzał brak opcji relatywnego odwoływania się plików w LESS. Ogólnie masa problemów. I słabe rozwiązanie.
  • WE 2013 miał sass za pomocą… skompilowanego kompilatora SASS, który jest częścią paczki (trochę nawiązuje tutaj do wirusów, bo tutaj ściągasz parę toolsów, nie wiesz co w nich jest, nawet nie wiesz, że je masz, a masz, nie wiesz, że działają a działają), zaś less kompilowany jest za pomocą node. Czyli trochę zmian jest i sposobie działania
  • WE 2015 nie posiada nic z tego co wyżej. Ale jest Web Compiler który zawiera to co potrzeba. Teraz jak działa Web Compiler? Znów na node. Nawet zawiera go jako część paczki (7zip) do tego zawiera także 7z.exe. To jak on kompiluje SASS? Tak samo jakbyś to robił ty – node-sass, z tą różnicą iż on ściąga Ci tą dllkę co może zawierać wirusa.

Więc nie wiem tak naprawdę jak WebEssentials miałoby być lepsze od node, kiedy ono z node korzysta. Prawda, było ładnie opakowane, ale moim zdaniem programiści Windows są za bardzo rozpieszczeni myszką – ogólna uwaga. Do tego, MS zawsze coś ograniczał, tutaj nie mamy tych ograniczeń, możemy wszystko tak jak chcemy i więcej niż VS umożliwia.

Obawa o wirusy

Prawda, mają prawo być i istnieć. Jednak popatrz na reputację danego repozytorium, także na to, że to jest github – który zakazuje czegoś takiego. Jakby wyszło, że w popularnym repo jest wirus, to by je zamknęli. Więc bym się nie obawiał aż tak. Do tego masz skanery, możesz przeskanować. Do tego nugetowi wierzysz, a to przecież ktoś u siebie lokalnie kompiluje… więc tutaj raczej bym aż tak bardzo nie panikował.

Ostrożności nigdy za wiele, ale znów, nie wolno przesadzać.

Pytanie o ramdysk itp

Chyba trzeba to rozbić na dwie sprawy, jedno to w ogóle wykorzystanie a drugie to sens wykorzystania tego na lokalnym projekcie na dev maszynie. Niezależnie od kontekstu, pomysł ciekawy, ale trochę imo przekombinowany :)

Jeżeli chodzi o dev maszynę, to nie, nawet nie robię optymalizacji npm, instaluje te paczki które są mi potrzebne i tyle. To jest w końcu dev, robię to raz na projekt, potem by jeszcze sprawdzić czy jakiejś nie pominąłem.

Zaś na build server rozwiązanie to jest trochę przesadne, w sensie pomysł ciekawy, ale za dużo z nim zachodu, do tego typ paczek i wersja mogą się zmieniać, więc to i tak musi być dynamiczne. Nawet po rozpakowaniu w ramdysk co będzie szybkie, to i tak trzeba odpalić prune i install na build serwerze. Tego się nie da pominąć, bo my musimy sprawdzić czy nasz projekt się kompiluje, i czy wszystkie zależności mogą zostać spełnione. Jak tak będzie. To potem wiemy, że za pół roku wykonamy tą samą czynność to nam to zadziała tak jak poprzednio. A to jest bardzo ważne kiedy musimy mieć wsparcie dla poprzednich wersji.

Podsumowanie

Mam nadzieję, że odpowiedziałem na Twoje pytania/wątpliwości. W szczególności te które Cię najbardziej trapiły. Jak nie to daj znać w komentarzu a postaram się już bez posta na to odpowiedzieć :)

2 KOMENTARZE

  1. Witaj,
    dziękuję, ze poświęciłeś czas na obszerną odpowiedź.

    Zrobiłem aktualizację node z 3.6 (chyba z września) do 5.2.0 i npm do 3.5.2. Oczywiście po drodze padł sass,
    sugerowane npm rebuild nie pomógł, dopiero pomogło usunięcie node_modules.

    Jest trochę lepiej, plików jest dużo mniej i faktycznie spłaszczone (ale nie do końca, gulp-concat powiela biblioteki), nawet bez opcji –no-optional.
    Jednak w części pakietów dalej przemycają (makefile, travis, testy). W dodatku nieraz pliki są niepotrzebne powielone
    np. asyc/lib/async.js i async/lib/dist/async.js to identyczne pliki. Niby drobiazd, ale pokazuje bałaganiastwo w rozwiązaniu.

    Zauważyłem też, ze –cache-min 999999 nie działa (wykłada się po wyłączeniu internetu) i nie ma nigdzie w dokumentacji
    informacji o tej opcji (choćby tu https://docs.npmjs.com/cli/install)

    Pisałeś o zaglądaniu do node_modules – akurat ja jestem osobą, która się czuje “chora” jak nie wie,
    jak mniej więcej działa nowy mechanizm (dlatego tez jeszcze nie rozumiem zachwytow nodejs)
    Dlatego też konfiguracja gulp była dla mnie katorgą, bo w necie nie było jasno opisane czy task ma mieć w środku return czy nie,
    z watchem były przykłady gulp.watch i z modułem watch, a rozwiązanie problemu przerwanego watcha to jedna linijka: “zanim pojawi się gulp 4.0.0 używać gulp-plumber.”
    Fajnie, tylko to powinno być od razu w dokumentacji, a nie że rozłazi się watcher, bo zapisaliśmy js bez jednego nawiasu.
    Do tego task runner w VS2015 trochę się zacina, no ale to nie wina node’a.

    Sam widzisz, jest to trochę świeże co powoduje stratę czasu.
    Twoja kombinacja z pakowaniem katalogu cache nie miałaby racji bytu, gdyby od razu pomyśleli i npm pakował
    wszystko w rozróżnieniem wersji w globalnym archiwum.
    Wtedy zamiast plątającego się node_modules nie byłoby nic, a npm install sprawdziłby tylko istnienie modułów.
    Byłoby oszczędnie, szybko. Myślę, że na to wpadną tak jak wpadli ze spłaszczeniem (w wersji 3 dopiero).

    Tak, wiem, pytanie filozoficzne: model open – każdy sobie coś tam skrobie zamiast zrobić raz a dobrze.
    Ładnie to opisano w historii file watchera – oryginalny moduł miał problem z OSX, więc zamiast naprawic,
    ktoś inny napisał trochę lepszą wersję o innej nazwie i dopiero trzecia była poprawną wersją.
    Microsoft powoli wydaje ASP.NET6, teraz wiem dlaczego :-D

    Odnośnie VS2013, wiem, ze było w node, ale działało to fajnie w tle bez kombinacji – edytowałeś scss i od razu widziałeś css.

    Pisałeś, że nuget ma wady, bo wrzuca js do Scripts, ale z kolei bower wrzuca do bower_components\\dist wiec
    i tak trzeba to przeniesc w czasie buildu czy publish. Mogli w bower.js dodać opcje, gdzie i pod jaka nazwa bylaby wrzucana tresc dist
    i byloby cacy. Te, kto scala js wrzucalby gdzie tam hen daleko, kto nie – w scripts, lib czy inne miejsce pod dystrybucje.

    Mozna to zrobić zadaniem postbuild, ale zgadzam sie, trochę drewniane to rozwiazanie.
    Z aktualizacją to bym nie widział problemu, nawet ręcznie. Dlaczego: bo mimo schematu numeracji
    i tak wersje w ramach major mogą się rozjeżdżać np. w jquery .live() było w 1.3, a zniknęło w 1.9,
    więc zamiast zrobić update po majorze, lepiej poczytać. W każdym razie ja jak działa,
    to nie aktualizuje, bo już parę razy się nadziałem, a mistrzem był Microsoft, gdzie aktualizacja MVC3 miała dll w wersji 3.0.1
    i oczywiście nie pasowała do Razora 1 ( brakowało metody czy czegoś).

    Pisałeś o MSBuild: “MS BUILD jest… istnieje ok, i nie będę się inaczej na jego temat wyrażał.
    Gdybym miał napisać coś i skonfigurować to z wykorzystaniem MS BUILD to bym sobie krakersami żyły pociął.”
    Miałeś jeszcze NAnt i widzę, że cześć projektów open uzywa Ruby/Python, może to jest rozwiązanie – wgrywasz raz, używasz cały czas?

    “By to skompilować pod Windows trzeba się dalej namęczyć. Ale chyba mniej niż by mieć w pełni działający Ruby.”
    Jakie miałeś problemy z Ruby? Wgralem z ciekawości, dodalem sass i działało bez problemów. Skoro ci od Ruby
    mieli rozwiązanie od dawna, to raczej to działało.

    Nie mogę się doczekać cześci III !

    Pozdrawiam

    P.S. z underscore trafiłem przypadkiem :-D

  2. Chyba bede musial na kilka odpowiedzi to podzielic :)

    wiecej o cache min: cache-min. I nie jest to opcja offline, ale nie bedzie sie odpytywal o nowsza wersje paczek, co jest dosc wazne, czyli masz tyle mniej requestow ile jest paczek.

    sprawda z underscore – nie wiem jak trafiles jak bower mial nowsza niz nuget :)

    sprawa z ruby i windows: moze teraz wkoncu sass naprawili albo tak naprwade wykorzystuja libsass podspodem, bo wczesniej byly z tym niezle problemy. ogolnie ruby nie lubia sie w pelni z windowsem. nie liczac problemow z gemami, devkitem itp. ogolnie trzbe ba sie bardziej nameczyc niz by sie chcialo.

    dlaczego zrobili wersje c kompilatora do sass: bo ruby byl powolny nie dzialal wszedzie, powodowal problemy, co aktualizacja gem itp na roznych systemach na roznych wersjach systemowych itp itd. pamietaj ze tutaj trzeba wspierac: linux dist okrslone, mac rozne wersje, win xp-10, troche tego jest i wiele miesc by cos nie dzialalo.

    DSLki do budowania projektow: isnieje wiele DSL dla budowania projektow, moze to byc F#, PowerShell, Ruby etc. I super ze istnieja bo inaczej to by byla posucha w .NET. Dalej jednak uwazam ze Grunt i Gulp w taskach bija te o glowe. Prostota i przenaszalnosc, super sprawa.

    wrzucanie statycznych plikow: nuget wrzuca tam gdzie tworca paczki okresli, w bower zas ty okreslasz lokalizacje gdzie beda te wszystkie paczki installowane, to moze byc bower_compontenst jak i /content/js/lib. Do tego masz plik .bowerrc – konfiguracyjny gdzie okreslasz repo’s z korego ma ciagnac jak i miejsce gdzie ma to isntalowac. podobnie jak nuget ma swoj nuget.config xml troche krzywy ale ma i mozna okreslac repo jedynie z ktorych bedzie pobieral.

    bower i dist: przyjelo sie ze folder dist od komponentu zawiera dist, a ja kto jest z wykonywaniem tego, pewnie tak samo jak wszedzie indziej w tym i pieknym swiecie .net, gdzie knockout.js to minifikowana wersja a knockout.debug.js to wersja “czytelna”. mozna isc za przyjetymi konwencjami jak i mozna je lamac :) to zalezy od tworcow paczek

    rozumienine jak cos dziala i katorga: jezeli chesz zrozumiec jak cos naprawde dziala to polecam dokumentacje, jest to dobrze tam opisane, na jakiej zasadzie sa paczki, jak to jest polaczone, dlaczego cos trafia do flat a cos do podrzednego, dlaczego takie a nie inne decyzje. wszystko jest open i mozna sie wszystkiego dowiedziec. Jest to napewno duzo lepiej zorganizowane niz pewne tajemne tricky i problemy nuget ktore sa niewyjasnione i nie wiadomo dlaczego cos dziala raz tak a raz inaczej. Na tworzenie paczek nuget mozna by napisac epopeje, bo to jest mala porazka.

    probelmy z jezykiem js: jezeli masz problemy z nawiasami, srednikami itp, to jest zrozumiale i nie raz sie na tym ludzie przejechali, dlatego tez, powstaly narzedzia ktore Ci to wykrywaja. na przyklad jshint, jslint itp. do tego kazdy znany mi edytor kodu ma wsparcie dla tych narzedzi, wiec takie sprawy da sie szybko wykryc. Tutaj nie wiem czy masz ogoolnie problem z tym ze to jest JS czy z czyms innym. bo jakby takie cos bylo napisane i do zrobienia w C# to bylo by ok? bo jezeli to kwestia jezyka to… to jak dyskutowac o tym ze spacja czy tab.

    co do dokumentacji gulpa: ? nie wiem dokladnie o co chodzi. Bo jes napisane po co i kiedy zwracac w dokumentacji

    task runner w VS2015: jest bugowaty, mi nie dziala dla wiekszosci taskow gulpowych. gdzie wszedzie indziiej smiga, tylko nie w VS.

    moje pakowanie katalogu (global ponizej): tutaj chyba nie rozumiesz czemu ja to pakuje. Przy build serverze, za kazdym razem masz clean pobranie do losowo stworzonego katalogu calego repo i wykonaniu wszystkich krokow poczawszy od sciagniecia zaleznosci, budowania solution i wgrania tego na odpowiedni serwer. To znacyz ze przy kazdym Twoim check in, wykonywany jest pure npm install. zip tutaj jest potrzebny po to by skrocic czas instalacji paczek, ktore na komputerze dev moze trwac 5-20 min, zas na build gdzie jest to wykonywane 20-40 razy dziennie, nie moze. Wiec trick jest przywracania katalogu i jego aktualizacja za pomoca prune i install, niz zamisat to robic od zera.

    global location dla modules: to jest zle, global to jest per komputer, chcesz miec cache to miej, ale nie instaluj zwyklych paczek do global, to jest inne przeznaczenie, inny sens, inny typ paczek. ale zakladajac nawet ze by tak sie instalowalo. To jest to zle, ze zwgledu na to, ze przy build serwerze ja nie mam zielonego pojecia czy mi dziala build bo cos juz bylo w global paczkages, czy dlatego ze mialem dobrze skonfigurowany projekt i wszystkie paczki wymienione. do tego, Twoja aplikacja kotora dziala, musiala by miec dostep do global folder, co juz jest zle.

    powielanie bibliotek mimo splaszczenia: tak jak w dokumentacji opisali, jezeli nastepuje conflict to powielaja. jaki conflict? trzeba by bylo przesledzic caly log instalacji.

    zmiany major wersji: ogolnie jak sie zmienia major to nie zawsze nawet proste komendy zadzialaja i tak moze byc i tak tez jest ok. Jakbys robil aktualizacje pomiedzy 3.6.0 a 3.6.1 i npm 2.5 na 2.6 to byloby ok. ale jak skaczesz juz major to ma prawo cos sie wywalic i tutaj jest dla mnie ok ze rebuild nie zadziala bez clean.

    z tego zaraz sie moze zrobic chyba pare postow :) dzieki za komentarze :)

Comments are closed.