Dziś będzie o problemach jakie mogą spotkać podczas tworzenia aplikacji w .NET Core i jak im zapobiegać. Moje problemy dotyczą wersji 1.0.0-rc1-update2
, ale podejrzewam, że będą obecne do wydania pierwszej wersji stabilnej – niektóre nawet dłużej.
Problem 1 – Referencjonowanie PCL
Od pewnego czasu można tworzyć projekty PCL, które wspierają ASP.NET Core. Na liście wyboru wspieranych frameworków pojawiła się nowa pozycja:
Wszystko fajnie, ale mając w jednej solucji projekt PCL i ASP.NET Core to nie zawsze chce działać. Podczas dodawania referencji projektu PCL do projektu ASP.NET Core pojawia się błąd instalacji. Jak się nie pojawi to masz szczęście. Nie znalazłem jeszcze powodu takiej sytuacji (być może to kwestia nazw projektów lub zainstalowanych zależności). W każdym razie chciałem powtórzyć sytuację, żeby zrobić screena i wtedy akurat zadziałało 🙂
Rozwiązaniem tego problemu jest stworzenie paczki NuGet (do głownego repozytorium lub jakiegoś prywatnego np. myget) i instalacja zależności przez NuGet. Przed instalacją należy jednak usunąć referencję z project.json i usunąć z folderu „wrap” folder z nazwą projektu, który przenieśliśmy na NuGeta. W folderze „wrap” znajdują się pliki konfiguracyjne projektu (project.json) w stylu .NET Core właśnie po to, żeby było możliwe dodanie referencji projektu starego typu (*.csproj – tutaj PCL) do projektu nowego typu (*.xproj).
Prawdopodobnie zawartość projektu „wrap” była przyczyną moich błędów, ale z tego co pamiętam to usuwałem go i błędy się nadal pojawiały. Warto najpierw przetestować tę opcję.
Na koniec po przejściu na NuGeta warto jeszcze sprawdzić czy w folderze z cachem NuGeta nie znajduje się wersja 1.0.0 waszego przeniesionego projektu. Jak tak to usuńcie folder z tą wersją, bo inaczej NuGet nie będzie chciał zainstalować nowych paczek, jeżeli ich wersje bedą mniejsze niż 1.0.0. Cache NuGeta znajduje się w folderze C:\Users\<user>\.dnx\packages\<package name>
.
Problem 2 – błąd instalacji paczek z NuGeta
Jak podczas instalacji paczki z NuGeta dostajesz błąd podobny do tego:
[...] Errors in C:\<some path>\<some project>\project.json Unable to locate Dependency Example.Dependency >= 0.4.1
To po takiej operacji odpal z konsoli:
dnu restore --no-cache
Wygląda na to, że dnu w ASP.NET Core wywołując zapytania o listę dostępnych paczek korzysta z cache. Jeżeli pojawiła się nowa wersja paczki to możliwe jest, że przy wywołaniu zapytania HTTP o listę paczek zostanie pobrana wartość z cache i wtedy pojawi się taki błąd.
Błąd ten zmiksowany razem z pierwszym spowodował, że myślałem, że tworząc paczkę NuGet trzeba podać w pliku nuspec nazwę profilu razem z opcjonalnymi wartościami dla Xamarina, tj.
portable-net45+netcore45+wpa81+MonoAndroid+Xamarin.Mac+Xamarin.iOS+MonoTouch
Było tak ponieważ dla paczki, gdzie tak zdefiniowałem nazwę folderu w nuspec akurat pobranie zadziałało – nie skorzystało z cache. Ostatecznie okazuje się, że wszystko działa odpowiednią nazwą profilu, tj:
portable-net45+netcore45
Doszedłem do tego dopiero w momencie, gdy wrzuciłem nową wersję paczki i pojawił się taki sam błąd instalacji mimo tego, że miałem tą dłuższą, niby jedyną działającą nazwę profilu.
Problem 3 – tworzenie paczki wynikowej, publish
Jeżeli robiliście grubsze zmiany w zależnościach w projekcie, to przy odpalaniu komendy tworzącej paczkę wynikową w folderze output, najpierw skasujcie ten folder. Jeżeli lokalnie odpalany projekt działa, a po wrzuceniu na zdalne urządzenie nie, to pierwszym krokiem powinno być przetestowanie tej opcji.
Wygląda na to, że tworzenie paczki wynikowej nie działa do końca dobrze i mogą zostać tam pliki, które będą powodować problemy przy uruchomieniu projektu. Tak samo przy wrzucaniu aplikacji na zdalne urządzenie najlepiej wyczyścić starą zawartość na tym urządzeniu – inaczej pojawią się te same problemy.
To tyle jeżeli chodzi o problemy na jakie napotkałem. Mam nadzieję, że dzięki temu wpisowi uda się komuś zaoszczędzić czas. Ja na rozwiązaniu tych problemów straciłem jego sporo. Ten wpis przyda się także mi, gdybym jeszcze raz na nie natrafił i nie wiedział jak je rozwiązać.
Jako, że poradziłem sobie z tymi problemami, to niebawem pojawi się wpis o postępach w projekcie. Zrobione już jest podstawowe odtwarzanie audio – ale o tym w kolejnym odcinku.
Permalink
Jeszcze nie przesiadłem się na Core, ale muszę to w końcu zrobić!