티스토리 뷰

반응형

Uno Platform이 빠른 속도로 변화하고 있는데, Prism 라이브러리와 연결된 Project Template의 수정이 느리게 진행되다보니, 새로 생성되는 프로젝트에 오류가 발생하는 것 같습니다.

 

저도 정확히 오류가 발생하는 이유는 모르지만 해결 방법을 찾아서 포스팅을 합니다. 앞으로도 프로젝트를 새로 만드실 때 오류를 해결하는데 도움이 되면 좋겠습니다. 다만, ios, mac은 빌드를 할 수 없어서 수정하지 못했으니 참고 부탁드립니다.

 

0. 현재 환경

Uno Platform Solution Templates : Version : 3.10.7.7 (9/14/2021)

Prism Template Pack : Version 2.3.0 (1/5/2021)

 

1. Prism Uno 프로젝트 생성

Prism Blank App (Uno Platform)을 선택합니다.

Project name : KakiPrismUnoMigration

Create project

iOS, macOS 프로젝트를 Unload시켜 줍니다.

Build -> Configuration Manager... 메뉴 클릭해서 아래와 같이 수정합니다. UWP Build, Deploy 둘다 체크

F6을 눌러 빌드 합니다.

엄청난 오류가 발생합니다. 너무 많은 오류라 파일로 첨부 합니다.

builerror.txt
0.03MB

이 프로젝트를 실행 시키기 위해서는 Uno Platform 프로젝트를 하나 만들어야 합니다.

2. Uno Platform 프로젝트 생성

uno platform으로 검색하고 Multi-Platform App(Uno Platform)을 선택하고 Next를 클릭합니다.

Blank.Uno 입력 후 Create

여기서 필요한 프로젝트만 남기고 나머지는 unload 시킵니다.

Build -> Configuration Manager... 메뉴 클릭해서 아래와 같이 수정합니다. UWP Build, Deploy 둘다 체크하고 실행 프로젝트를 UWP로 선택한 후에 실행 합니다.

아래와 같이 나오면 정상적으로 실행이 된것입니다. 이제 이 프로젝트와 KakiPrismUnoMigration 프로젝트를 비교하면서 마이그레이션을 진행하면 됩니다.

3. 마이그레이션

1) KakiPrismUnoMigration.Core.csproj를 수정합니다.

<xml ../>삭제, 버전 넘버 수정

프로젝트 폴더에서 obj, bin 폴더를 삭제하고, Build를 실행하면 빌드가 됩니다.

<Project Sdk="MSBuild.Sdk.Extras/3.0.23">
  <PropertyGroup>
    <TargetFrameworks>uap10.0.18362;netstandard2.0;xamarinios10;xamarinmac20;MonoAndroid11.0;monoandroid10.0</TargetFrameworks>
    <!-- Ensures the .xr.xml files are generated in a proper layout folder -->
    <GenerateLibraryLayout>true</GenerateLibraryLayout>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Prism.Uno" Version="8.0.0.1909" />
    <PackageReference Include="Uno.UI" Version="3.10.7" />
  </ItemGroup>
  <ItemGroup>
    <Page Include="**\*.xaml" Exclude="bin\**\*.xaml;obj\**\*.xaml" />
    <Compile Update="**\*.xaml.cs">
      <DependentUpon>%(Filename)</DependentUpon>
    </Compile>
  </ItemGroup>
  <ItemGroup>
    <UpToDateCheckInput Include="**\*.xaml" Exclude="bin\**\*.xaml;obj\**\*.xaml" />
  </ItemGroup>
</Project>

2. KakiPrismUnoMigration.UWP.csproj을 수정합니다. 

수정을 위해서는 프로젝트를 Unload해야 합니다.

각 버전을 수정하고, 프로젝트를 다시 Reload한 후에 Build를 실행하고, F5키를 눌러 실행합니다.

  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <ItemGroup>
    <PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
      <!--
			If, in the same solution, you are referencing a project that uses https://github.com/onovotny/MSBuildSdkExtras,
			you need to make sure that the version provided here matches https://github.com/onovotny/MSBuildSdkExtras/blob/master/Source/MSBuild.Sdk.Extras/DefaultItems/ImplicitPackages.targets#L11.
			This is not an issue when libraries are referenced through nuget packages. See https://github.com/unoplatform/uno/issues/446 for more details.
			-->
      <Version>6.2.11</Version>
    </PackageReference>
    <PackageReference Include="Prism.DryIoc.Uno" Version="8.1.97" />
    <PackageReference Include="Uno.Core" Version="2.4.0" />
    <PackageReference Include="Uno.UI" Version="3.10.7" />
    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="1.1.1" />
    <PackageReference Include="Microsoft.Extensions.Logging.Filter" Version="1.1.1" />
  </ItemGroup>

 

3. KakiPrismUnoMigration.Droid.csproj

아래 버전들로 수정합니다.

  <ItemGroup>
    <PackageReference Include="Prism.DryIoc.Uno" Version="8.1.97" />
    <PackageReference Include="Uno.UI" Version="3.10.7" />
    <PackageReference Include="Uno.UI.RemoteControl" Version="3.10.7" Condition="'$(Configuration)'=='Debug'" />
    <PackageReference Include="Uno.UniversalImageLoader" Version="1.9.33" />
    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="1.1.1" />
    <PackageReference Include="Microsoft.Extensions.Logging.Filter" Version="1.1.1" />
  </ItemGroup>

아래 코드는 프로젝트 파일 맨 아래 추가합니다. 없어도 빌드할 때 오류가 나지는 않는데.. Uno 프로젝트에 추가되어있길래 추가했습니다.

  <Target Name="Issue3897Workaround" Condition=" '$(ManagedDesignTimeBuild)' == 'True' " AfterTargets="_RemoveLegacyDesigner">
    <!-- See https://github.com/unoplatform/uno/issues/3897 and https://github.com/xamarin/xamarin-android/issues/5069 for more details -->
    <ItemGroup>
      <Compile Remove="$(_AndroidResourceDesignerFile)" />
    </ItemGroup>
  </Target>

4. KakiPrismUnoMigration.Wasm.csproj 수정

닷넷5.0으로 수정, 리퍼런스 2개 추가, 버전 수정 후 빌드를 하면 실드가 성공합니다.

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
    <NoWarn>NU1701</NoWarn>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)'=='Debug'">
    <MonoRuntimeDebuggerEnabled>true</MonoRuntimeDebuggerEnabled>
    <DefineConstants>$(DefineConstants);TRACE;DEBUG</DefineConstants>
    <DebugType>portable</DebugType>
    <DebugSymbols>true</DebugSymbols>
  </PropertyGroup>
  <ItemGroup>
    <Content Include="Assets\SplashScreen.png" />
  </ItemGroup>
  <ItemGroup>
    <UpToDateCheckInput Include="..\KakiPrismUnoMigration.Shared\**\*.xaml" />
  </ItemGroup>
  <ItemGroup>
    <EmbeddedResource Include="WasmCSS\Fonts.css" />
    <EmbeddedResource Include="WasmScripts\AppManifest.js" />
  </ItemGroup>
  <ItemGroup>
    <LinkerDescriptor Include="LinkerConfig.xml" />
  </ItemGroup>
  <ItemGroup>
    <!--
    This item group is required by the project template because of the
    new SDK-Style project, otherwise some files are not added automatically.

    You can safely remove this ItemGroup completely.
    -->
    <None Include="Program.cs" />
    <None Include="LinkerConfig.xml" />
    <None Include="wwwroot\web.config" />
  </ItemGroup>
  <ItemGroup>
    <!-- Note that for WebAssembly version 1.1.1 of the console logger required -->
    <PackageReference Include="Microsoft.Windows.Compatibility" Version="5.0.0" />
    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="1.1.1" />
    <PackageReference Include="Microsoft.Extensions.Logging.Filter" Version="1.1.1" />
    <PackageReference Include="Microsoft.Extensions.Logging" Version="5.0.0" />
    <PackageReference Include="Uno.Extensions.Logging.WebAssembly.Console" Version="1.0.1" />
    <PackageReference Include="Prism.DryIoc.Uno" Version="8.1.97" />
    <PackageReference Include="Uno.UI.WebAssembly" Version="3.10.7" />
    <PackageReference Include="Uno.UI.RemoteControl" Version="3.10.7" Condition="'$(Configuration)'=='Debug'" />
    <PackageReference Include="Uno.Wasm.Bootstrap" Version="2.1.0" />
    <PackageReference Include="Uno.Wasm.Bootstrap.DevServer" Version="2.1.0" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\..\KakiPrismUnoMigration.Core\KakiPrismUnoMigration.Core.csproj" />
  </ItemGroup>
  <Import Project="..\..\KakiPrismUnoMigration.Shared\KakiPrismUnoMigration.Shared.projitems" Label="Shared" Condition="Exists('..\..\KakiPrismUnoMigration.Shared\KakiPrismUnoMigration.Shared.projitems')" />
</Project>

실행 결과...를 보면 뭔가 허전합니다. 무엇 때문인지 아시겠어요?

답은 Main Page라는 글씨가 없는 것입니다. 음..Main Page가 바인딩되어있는 글씨인데.. 이 문제 해결은 LinkerConfig.xml에 Core 프로젝트 이름을 추가하는 것으로 해결됩니다.

<linker>
  <assembly fullname="KakiPrismUnoMigration.Wasm" />
  <assembly fullname="Uno.UI" />
  <assembly fullname="KakiPrismUnoMigration.Core" />
  <assembly fullname="System.Core">
    <!-- This is required by JSon.NET and any expression.Compile caller -->
    <type fullname="System.Linq.Expressions*" />
  </assembly>
</linker>

고치는 김에 처음 SplashScreen 배경색도 투명하게 WasmScripts\AppManifest.js 파일을 수정합니다.

var UnoAppManifest = {
    splashScreenImage: "Assets/SplashScreen.png",
    splashScreenColor: "#fff",
    displayName: "KakiPrismUnoMigration"
}

최종 실행화면 입니다.

반응형
댓글