Asp.Net Core – o migracji z RC1 do RC2 słów kilka.

Siemanko.

Dziś kilka wskazówek jak podejść do próby migracji projektu z wersji RC1 do RC2. Celowo napisałem „próby” ponieważ nie ma pewności, że Ci się to uda 😉 Wszystko zależy od struktury Twojego projektu oraz od Twojej odporności na dziwne błędy uniemożliwiające kompilację, które nie są zgłaszane przez IDE. Subiektywnie podzieliłem operacje migracji na dwa przypadki:

  • kiedy masz tylko web application
  • kiedy masz web application z referencjami do class library packages

Oczywiście musisz mieć zainstalowany .NET Core. Możesz to zrobić instalując update w Visual Studio lub pobierając go tutaj.

Samo Web Application

W wersji RC1 web application było jednym template’em.

3

Template web application w wersji RC1

Na poziomie tworzenia należało wskazać czy ma to być aplikacji Asp.Net 5 czy poprzednia

4

Następnie w pliku project.json należało wskazać runtime (clr lub coreclr, lub oba).

W wersji RC2 mamy dwa template’y web application – jeden dla .NETu, a drugi cross platform

2

Proponuję Ci utworzyć odpowiedni template (jeśli w Twoja aplikacja RC1 jest cross platform i korzysta z dnxcore to wybierz .NET Core, jeśli z samego dnxa to .NET Framework). Przejdź do pliku global.json nowo utworzonej solucji, skopiuj sdk version i wklej w to samo miejsce w swoim projekcie RC1.

1.png

global.json w wersji RC1

 

 

1

global.json w wersji RC2

Oczywiście wersja sdk 1.0.0-preview1-002702 w RC2 jest taka na dzień pisania posta.

Przejdź do katalogu C:\Users\nazwa_usera i skasuj folder .dnx. Tak, skasuj. Dnxa już nie ma i wszystko co jest w tym folderze już nie jest potrzebne, a może tylko generować jakieś trudności.

Dostosuj swój project.json do tego, który jest w wygenerowanym nowym szablonie i zacznij zmieniać namespace’y paczek w sekcji dependencies. Tutaj musisz zdawać się na IDE i błędy, które zgłasza (np. namespace’y z AspNet trzeba zmienić na AspNetCore itp.). Jak już uda Ci się doprowadzić error list do pustki to przejdź do package manager console, a w nim do folderu aplikacji i wpisz dotnet restore. Powinny zacząć pobierać się wszystkie paczki nugetowe. Reaguj na błędy, restoruj paczki i tak w kółko do skutku 🙂 Zamknięcie Visuala i ponowne otwarcie jest jak najbardziej wskazane 😉

Web Application z referencjami do class library packages

Tu już jest gorzej ponieważ w RC2 nie ma tego wynalazku – class library package z niebieską ikonką i plikiem project.json

1.png

Class library dla Asp.Net Core w wersji RC1

Teraz mamy normalne „zielone” class library

1

Class library w wersji Asp.Net Core RC2

Jak widać na zdjęciu mamy także dwa typy class library – dla .NET Core i dla .NET Framework. Aby nasz projekt zabanglał w RC2 to niestety musimy utworzyć całkiem nowe class library i pokopiować do nich klasy oraz dodać wszystkie paczki nugetowe przez Nuget Package Manager (w poprzedniej wersji można to było zrobić w pliku project.json). Należy pamiętać aby zaznaczyć ckeckbox Include prerelease podczas wyszukiwania paczek.

Podsumowanie

Życzę Ci powodzenia i wytrwałości. Pamiętaj jednak, że zawsze możesz utworzyć całą solucję od nowa i pokopiować pliki, albo po prostu rzucić to wszystko i wyjechać w Bieszczady 😉

Pjona!

„Hub could not be resolved” czyli kwiatuszki w Asp.Net Core RC2

Siemanko.

Całkiem nie dawno pisałem o tym, że udało mi się przejść na wersję RC2 frameworka Asp.Net Core. Wersję, której żywot określono na krótko bo pod koniec czerwca ma wyjść już RTM. Z tego względu wydawałoby się, że jest to już dopieszczona wersja i wszystko jest w niej cacy… ale niestety.

Problemy z SignalR

W wersji RC1, w moim projekcie zacząłem się już komunikować poprzez SignalR między apką mobilną, a serwerem. Po upgrade’dzie projektu do wersji RC2 po chwilce przerwy przysiadłem znowu do pracy i ku mojemu zdziwieniu po próbie połączenia się apki z serwerem aplikacja mobilna się wywalała. Zapewne znasz to uczucie gdy nie zmieniłeś choć jednej linijki kodu, IDE nie sypie errorami, a coś co działało jeszcze wczoraj z niewiadomych przyczyn przestało. Po kilku godzinach prób zacząłem debugowanko na serwerze. W Sturtup.cs przed deklaracją SignalR zamieściłem kilka linijek kodu aby następne wywołanie na pipeline złapać w try catch:

1

Zacząłem googlować i doklikałem się do issue na githubie. Otóż w wersji RC2 popsuto coś co działało w RC1 😉

Workaround

Gość na githubie podsunął mi tymczasowe rozwiązanie. Otóż bug jest w klasie DefaultAssemblyLocator.cs, który został już poprawiony, ale znajduje się w paczce RC3 z referencjami do inncyh paczek RC3, które zarazem będą się gryzły z RC2Skopiowałem kod tej klasy i umieściłem go w swoim projekcie w nowo utworzonej klasie o nazwie HubCouldNotBeResolvedWorkaround (możesz nazwać jak chcesz). W Sturtup.cs w metodzie ConfigureServices tuż przed wywołaniem

services.AddSignalR();

należy umieścić linijkę 

services.AddSingleton<IAssemblyLocator, HubCouldNotBeResolvedWorkaround>();

Ten kod oznacza ni mniej ni więcej jak dla każdej zależności IAssemblyLocator wstrzyknij obiekt HubCouldNotBeResolvedWorkaround, który ma być singletonem w ramach całej aplikacji. W ten sposób IAssemblyLocator  z paczki SignalR RC2 z bugiem został zastąpiony poprawionym z wersji RC3 bez konieczności upgrade’u całego projektu do RC3 (która jest tylko na deweloperskich serwerach Nuget)

Podsumowanie

Mam nadzieje, że dzięki temu wpisowi zaoszczędzisz kilka godzin na kminienie co może być nie tak – tak jak ja.

Pjona!

Projekt Asp.Net Core po wielu godzinach przeniesiony do wersji RC2.

Siemanko

W sobotę napisałem, że zaczynam atakować mój projekt back’endowy w celu przeniesienia go na .NET CLI i wyswobodzenia go od skasowanego DNX’a – czyli przejście na oficjalną wersję RC2 frameworka. Nie trwało to kilka dni jakby wskazywał na to kalendarz, ale krócej bo właściwie znalazłem czas aby przysiąść do tego tylko trzy razy. Pierwszy raz był we wspomnianą sobotę i to posiedzenie zakończyło się moją klęską, i niezłym wkurwieniem ocierającym się o rezygnację z programowania i wzięcia się za grę w brydża 😉 Drugi raz był wczoraj wieczorem gdzie przyjąłem nieco inną taktykę, która także okazała się nieskuteczna jednak doprowadziła do wyklarowania się decyzji o utworzeniu nowej solucji wraz z nowymi projektami i przenoszeniu do nich klas z istniejącego projektu. Tym się właśnie zająłem dziś i mogę powiedzieć, że się udało. Projekt się kompiluje oraz uruchamia.

1

O tym co się zmieniło oraz najważniejsze – jak to przeniosłem – napisze po weekendzie. Teraz mogę Ci powiedzieć tylko tyle, że olej sobie dokumentację migracji przygotowaną przez ekipę Asp.Net Core. Opisuje ona różnice w plikach konfiguracyjnych i takie tam pierdololo, ale nie mówi jak przenieść istniejący projekt ASP.NET Core RC1 do ASP.NET Core RC2. Jak będziesz grzeczny to ja Ci napiszę 😉

Pjona!

Pierwsze podejście do upgrade’u projektu Asp.Net Core – from DNX to .NET Core Cli

Siemanko

Piękny, słoneczny dzień dziś (przynajmniej u mnie) dlatego postanowiłem sobie go nieco zjebać i spróbuje przenieść aplikacje serwerową do najnowszej wersji frameworka czyli Asp.Net Core 1.0 Rc2. Niby kolejny release candidate, ale kompletnie inny pod spodem. Cóż, ewolucja 🙂 Dam znać niedługo czy jest w ogóle możliwa migracja z Rc1 do Rc2 bez nowych siwych włosów i czy w ogóle się da. Microsoft’owe ludki twierdzą, że się da i nawet odziwo przygotowali do tego jakąś dokumentację. Wszystkiego możesz się dowiedzieć tutaj. Życz mi powodzenia 🙂

Pjona!

Widok do prowadzenia rozmowy w czacie aplikacji Mobile Second Hand

Siemanko.

W niedzielę poszły pierwsze commit’y do repo związane z czatem, a dziś lecą kolejne z m.in. z nowym activity do prowadzenia rozmów real time (oczywiście  w deweloperskim wyglądzie jak to przystało na takie totalne bezguście jak ja ;))

IMAG0082

Bubble Chat

To wyrażenie przewija się w internetach i oczywiście wśród użytkowników fejsbukowego messenger’a. Wiadomości wyświetlane w formie bąbelków, dymków itp. jak zwał tak zwał. Moja aplikacja nie może być gorsza i musi nadążać za trendami 🙂 Sama implementacja jest bardzo prosta. Każda z wiadomości to osobny row view zamknięty w relative layout, a ten z kolei odpowiednio ostylowany w momencie bind’owania view holder’a na podstawie informacji czy autorem wiadomości jest użytkownik. Informacja tą zawarłem w modelu wiadomości przekazywanego do list adaptera.

Co nowego na serwerze

W momencie łączenia się usera z serwerem SignalR zapisuję sobie do cache’a (serwera) jego id wraz z id połączenia. W ten sposób będę łatwo mógł sprawdzić, który user jest online, a także pobrać jego id połączenia w przypadku potrzeby wysłania do niego wiadomości. Oczywiście w przypadku rozłączenia się usera aktualizuję listę użytkowników online w cache’u. Dlaczego cache? Bo szybki. Co będzie jak trzeba będzie zrestartować aplikację na serwerze i dane z cache’a znikną? Nic nie będzie bo tym samym użytkownicy zostaną rozłączeni i po restarcie będą się ponownie łączyli więc cache znowu się zapełni 🙂

Podsumowanie

Podsumowując to wiecie, że to już mój 11sty tydzień aktywnego rozwijania projektu i blogowania w konkursie #dajsiepoznac? Tym samym spełniłem już warunki konkursu, aby być branym pod uwagę przy wynikach choć te nie są najważniejsze bo największą frajdę podczas mojego uczestnictwa w konkursie sprawia mi nauka nowych rzeczy. Jestem zadowolony, że udaje mi się znaleźć czas, aby troszkę pokodować oraz popisać głupot w internetach, dlatego nie zamierzam na tym poście poprzestać i będę męczył Was dalej! 😉

Pjona!

Kolejny widok w aplikacji Mobile Second Hand. Tym razem szczegóły ogłoszenia.

Siemanko.

Dziś króciutko o kolejnym ficzerze apki mobilnej – oczywiście w mocno deweloperskim stanie 😉 – przejście na szczegóły ogłoszenia oraz ich wyświetlenie.

Wejście w szczegóły po naciśnięciu elementu na liście

Pokazywałem już we wcześniejszych postach jak wygląda lista ogłoszeń pobranych z serwera, ale dla przypomnienia:

13177151_1011632882250440_2934029842522300517_n

To jest lista okrojonych wersji ogłoszeń, którą można sobie scrollować od góry do dołu i odwrotnie 😉 Jeśli któreś ogłoszenie jest szczególnie interesujące wystarczy w nie kliknąć aby przejść do jego szczegółów.

13177393_1011632665583795_5778124407927892321_n

Widok jest oczywiście scrollowalny dlatego szczegółów mogę tam zamieścić więcej jeśli przyjdą mi jakieś do głowy.

Co jest na szczegółach

Pewnie powiesz, że nie wiele więcej niż na liście 😉 Tak, w tej chwili tak, ale wynika to z faktu, że na tę chwilę nie główkuję co by się tu jeszcze przydało, a nie z ograniczeń technologicznych. Wracając do nagłówka:

  • odległość do sprzedającego – jest też na liście
  • informacja o stanie sprzedającego online/offline  – to będzie powiązane z chatem (nad którym zaczynam pracować)
  • informacja o tym czy sprzedającego interere tylko sprzedaż rzeczy czy jest tez zainteresowany wymianką – nie ma na liście
  • button do nawiązania kontaktu – związane z chatem i komunikacją real-time (nad którym zaczynam pracować). Przeniesie na widok wiadomości
  • zdjęcie – będzie większe i po kliknięciu wypełni ekran
  • tytuł – jest też na liście
  • dokładny opis – nie ma na liście
  • button do zobaczenia innych ogłoszeń autora tego ogłoszenia – przeniesie na listę ogłoszeń tylko tego sprzedającego (prawie jak na allegro ;))

Jak się to odbywa

W momencie kliknięcia elementu listy rzucam zdarzenie, którego argumentem jest Id danego ogłoszenia. Przy obsłudze zdarzenia startuje nowe Activity, do którego przekazuje to Id i w nim pobieram z serwera model z danymi dla tego ogłoszenia.

Podsumowanie

Jako tako to wygląda i nawet działa 😉 Teraz jak wspomniałem zaczynam bawić się z chatem i powiadomieniami. To ma być jeden z głównych ficzerów aplikacji. W niedzielę  o pierwszych kodach z tym związanych.

Pjona!

Jeśli nie ma czegoś w nugecie tzn., że to nie istnieje? Nuget to nie google i ma swoje package source.

Siemanko

W poprzednim poście napisałem, że będę próbował zupgradować projekt back endu do nieoficjalnej najnowszej wersji frameworka Asp.Net Core (RC2) tzw. nightly builds. Było to podyktowane tym, że chciałem zacząć pracę nad implementacją czatu dla użytkowników aplikacji mobilnej mojego projektu. Jeśli czat to sockety, a jeśli sockety i asp.net to SignalR. Niczego jeszcze nie robiłem z SignalR, ale kiedyś oglądałem jakiś kursik, gdzie m.in. była prezentacja SignalR dlatego od samego początku miałem w głowie, że właśnie z tym ustrojstwem będę się bawił robiąc czat.

Wracając do upgrade’u. Dlatego pisałem o potrzebie podniesieniu wersji frameworka bo w aktualnym RC1-final nie było paczki SignalR w kombatybilnej wersji

1

Screen z pliku project.json z sekcji dependencies

Lipa, nie? A przeglądając github’a widziałem przykłady SignalR, ale w wersji frameworka RC2, dlatego też ślepo przyjąłem, że w aktualnej wersji RC1-final po prostu nie ma SignalR.

Package Manager Source

Wszystkiemu winna (bądź nie) konfiguracja źródeł dla nugeta, a raczej informowanie zwykłych devów o adresach serwerów, z których można pobierać paczki publikowane prze teamy pracujące nad frameworkami, których Ci zwykli devowie używają 😉 Tym zakręconym zdaniem przechodzimy do głównego bohatera dzisiejszego posta czyli nuget.config.

2

3

To co widzisz powyżej to nic innego jak programowa prezentacja pliku nuget.config znajdującego się w dokumentach użytkownika

4

To jest chyba standardowa wersja ustawień nugeta tzn. ze standardowym źródłem. Teamy Asp.Net Core i ogólnie całego nowego .Net Core mają swoją serwery, na których publikują paczki , i z których zarazem my – prości devovie – możemy je ściągać 🙂 Szkoda tylko, że nie informują o tym w dokumentacji tylko trzeba zaglądać do pliku nuget.config każdego z projektów na github’ie.  W moim przypadku dodanie źródła o adresie

https://www.myget.org/f/aspnetmaster/api/v3/index.json

poskutkowało pojawieniem się paczki SignalR w odpowiedniej dla mnie wersji

6

Podsumowanie

Jeśli nie możesz czegoś znaleźć w nugecie to nie zakładaj, że tego tam nie ma albo, że zjebało Ci się Visual Studio 😉 Niech Twym pierwszym działaniem będzie upewnienie się czy masz odpowiednie źródła wpisane do nuget.config. 

Pjona!