Avalonia源代码编译的一些总结

编译遇到的错误

初次编译Avalonia源码也许会遇到很多各种各样的问题。有一些问题根据错误提示能够比较容易的解决。但还有一些问题,根据错误提示也不太容易推测出来如何解决。在这里记录一下我遇到的一些问题,供遇到类似问题的朋友参考。

Namespace could not be found

bash 复制代码
megatron@localhost:~/SourceCode/Avalonia$ ./build.sh --target Compile --configuration Release
GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
Microsoft (R) .NET SDK version 7.0.404
/home/megatron/SourceCode/Avalonia/nukebuild/BuildTasksPatcher.cs(5,7): error CS0246: The type or namespace name 'ILRepacking' could not be found (are you missing a using directive or an assembly reference?) [/home/megatron/SourceCode/Avalonia/nukebuild/_build.csproj]
/home/megatron/SourceCode/Avalonia/nukebuild/Shims.cs(8,7): error CS0246: The type or namespace name 'Numerge' could not be found (are you missing a using directive or an assembly reference?) [/home/megatron/SourceCode/Avalonia/nukebuild/_build.csproj]
/home/megatron/SourceCode/Avalonia/nukebuild/Shims.cs(96,31): error CS0246: The type or namespace name 'INumergeLogger' could not be found (are you missing a using directive or an assembly reference?) [/home/megatron/SourceCode/Avalonia/nukebuild/_build.csproj]
/home/megatron/SourceCode/Avalonia/nukebuild/Shims.cs(98,25): error CS0246: The type or namespace name 'NumergeLogLevel' could not be found (are you missing a using directive or an assembly reference?) [/home/megatron/SourceCode/Avalonia/nukebuild/_build.csproj]

这是因为clone Avalonia代码库后,没有拉取submodule导致的。使用git submodule update --init拉取submodule后重新编译源码即可。

File being used by another process

ruby 复制代码
[ERR] Compile: /home/megatron/dotnet/sdk/7.0.404/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(211,5): error MSB4018: The "GenerateDepsFile" task failed unexpectedly. [/home/megatron/SourceCode/Avalonia/src/tools/DevAnalyzers/DevAnalyzers.csproj]
[ERR] Compile: /home/megatron/dotnet/sdk/7.0.404/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(211,5): error MSB4018: System.IO.IOException: The process cannot access the file '/home/megatron/SourceCode/Avalonia/src/tools/DevAnalyzers/bin/Release/netstandard2.0/DevAnalyzers.deps.json' because it is being used by another process. [/home/megatron/SourceCode/Avalonia/src/tools/DevAnalyzers/DevAnalyzers.csproj]
[ERR] Compile: /home/megatron/dotnet/sdk/7.0.404/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(211,5): error MSB4018:    at Microsoft.Win32.SafeHandles.SafeFileHandle.Init(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Int64& fileLength, UnixFileMode& filePermissions) [/home/megatron/SourceCode/Avalonia/src/tools/DevAnalyzers/DevAnalyzers.csproj]
[ERR] Compile: /home/megatron/dotnet/sdk/7.0.404/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(211,5): error MSB4018:    at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, UnixFileMode openPermissions, Int64& fileLength, UnixFileMode& filePermissions, Func`4 createOpenException) [/home/megatron/SourceCode/Avalonia/src/tools/DevAnalyzers/DevAnalyzers.csproj]
[ERR] Compile: /home/megatron/dotnet/sdk/7.0.404/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(211,5): error MSB4018:    at System.IO.Strategies.OSFileStreamStrategy..ctor(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode) [/home/megatron/SourceCode/Avalonia/src/tools/DevAnalyzers/DevAnalyzers.csproj]
[ERR] Compile: /home/megatron/dotnet/sdk/7.0.404/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(211,5): error MSB4018:    at System.IO.File.Create(String path) [/home/megatron/SourceCode/Avalonia/src/tools/DevAnalyzers/DevAnalyzers.csproj]
[ERR] Compile: /home/megatron/dotnet/sdk/7.0.404/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(211,5): error MSB4018:    at Microsoft.NET.Build.Tasks.GenerateDepsFile.WriteDepsFile(String depsFilePath) [/home/megatron/SourceCode/Avalonia/src/tools/DevAnalyzers/DevAnalyzers.csproj]
[ERR] Compile: /home/megatron/dotnet/sdk/7.0.404/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(211,5): error MSB4018:    at Microsoft.NET.Build.Tasks.TaskBase.Execute() [/home/megatron/SourceCode/Avalonia/src/tools/DevAnalyzers/DevAnalyzers.csproj]
[ERR] Compile: /home/megatron/dotnet/sdk/7.0.404/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(211,5): error MSB4018:    at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute() [/home/megatron/SourceCode/Avalonia/src/tools/DevAnalyzers/DevAnalyzers.csproj]
[ERR] Compile: /home/megatron/dotnet/sdk/7.0.404/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(211,5): error MSB4018:    at Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask(ITaskExecutionHost taskExecutionHost, TaskLoggingContext taskLoggingContext, TaskHost taskHost, ItemBucket bucket, TaskExecutionMode howToExecuteTask) [/home/megatron/SourceCode/Avalonia/src/tools/DevAnalyzers/DevAnalyzers.csproj]

使用fuser查看DevAnalyzers.deps.json并没有被别的进程使用。怀疑是并行编译导致的问题,不作任何修改,重新执行编译发现问题消失了。

The Android SDK directory could not be found

vbnet 复制代码
[ERR] Compile: C:\Program Files\dotnet\packs\Microsoft.Android.Sdk.Windows\33.0.95\tools\Xamarin.Android.Tooling.targets(70,5): error XA5300: The Android SDK directory could not be found. Install the Android SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk [C:\Users\megatron\SourceCode\Avalonia\src\Android\Avalonia.Android\Avalonia.Android.csproj]
[ERR] Compile: C:\Program Files\dotnet\packs\Microsoft.Android.Sdk.Windows\33.0.95\tools\Xamarin.Android.Tooling.targets(70,5): error XA5300: To use a custom SDK path for a command line build, set the 'AndroidSdkDirectory' MSBuild property to the custom path. [C:\Users\megatron\SourceCode\Avalonia\src\Android\Avalonia.Android\Avalonia.Android.csproj]
[ERR] Compile: Target Compile has thrown an exception

这是在Windows平台编译Avalonia时遇到的问题。机器确实安装了Android SDK但还是报错。推测由于Android SDK安装到了一个编译脚本无法检测到的位置导致的。把Android SDK的安装路径移动到C:\Program files(x86)\Android\android-sdk后问题得到了解决。

The Java SDK directory could not be found

vbnet 复制代码
[ERR] Compile: C:\Program Files\dotnet\packs\Microsoft.Android.Sdk.Windows\33.0.95\tools\Xamarin.Android.Tooling.targets(70,5): error XA5300: The Java SDK directory could not be found. Install the Java SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk [C:\Users\megatron\SourceCode\Avalonia\src\Android\Avalonia.Android\Avalonia.Android.csproj]
[ERR] Compile: C:\Program Files\dotnet\packs\Microsoft.Android.Sdk.Windows\33.0.95\tools\Xamarin.Android.Tooling.targets(70,5): error XA5300: To use a custom JDK path for a command line build, set the 'JavaSdkDirectory' MSBuild property to the custom path. [C:\Users\megatron\SourceCode\Avalonia\src\Android\Avalonia.Android\Avalonia.Android.csproj]
[ERR] Compile: Target Compile has thrown an exception

learn.microsoft.com/en-us/java/... 下载了微软的OpenJDK安装后问题得到解决。

执行workload-install安装Tizen workload无效

这是在安装Tizen workload时遇到的问题。执行workload-install时立即结束,没有任何错误提示,但看起来什么也没有发生,去dotnet workload的目录会发现Tizen workload并没有完成安装。使用strace分析了一下workload-install的执行过程,发现是dotnet命令无法被workload-install脚本导致的。使用export DOTNET_ROOT=/home/megatron/dotnet设置DOTNET_ROOT环境变量后,workload-install脚本就能正常执行了。

源码编译得到的nupkg

以下nupkg在Windows/Linux/macOS都能够编译出来的nupkg。

Package Name
Avalonia
Avalonia.Browser
Avalonia.Browser.Blazor
Avalonia.Controls.ColorPicker
Avalonia.Controls.DataGrid
Avalonia.Controls.ItemsRepeater
Avalonia.Desktop
Avalonia.Diagnostics
Avalonia.Direct2D1
Avalonia.Fonts.Inter
Avalonia.FreeDesktop
Avalonia.Headless
Avalonia.Headless.NUnit
Avalonia.Headless.Vnc
Avalonia.Headless.XUnit
Avalonia.LinuxFramebuffer
Avalonia.Markup.Xaml.Loader
Avalonia.ReactiveUI
Avalonia.Remote.Protocol
Avalonia.Skia
Avalonia.Themes.Fluent
Avalonia.Themes.Simple
Avalonia.Win32
Avalonia.X11

还有几个nupkg只能在特定平台编译得到。

Package Name Windows Linux macOS
Avalonia.Andriod Yes No No
Avalonia.iOS Yes No No
Avalonia.Win32.Interoperability Yes No No
Avalonia.Native No No Yes

可以看到如果想要通过编译得到所有的Avalonia nupkg,那么需要至少准备Windows和macOS两台机器来做编译。这里有个我还不太明白的地方:官方编译还需要Linux机器,既然Windows和macOS能编译出Avalonia所有的nupkg,那为什么还要再额外找一台Linux机器做编译呢?

相关推荐
码事漫谈2 小时前
大模型输出的“隐性结构塌缩”问题及对策
前端·后端
这儿有一堆花2 小时前
前端三件套真的落后了吗?揭开现代 Web 开发的底层逻辑
前端·javascript·css·html5
.Cnn3 小时前
JavaScript 前端基础笔记(网页交互核心)
前端·javascript·笔记·交互
醉酒的李白、3 小时前
Vue3 组件通信本质:Props 下发,Emits 回传
前端·javascript·vue.js
anOnion3 小时前
构建无障碍组件之Window Splitter Pattern
前端·html·交互设计
NotFound4863 小时前
实战分享Python爬虫,如何实现高效解析 Web of Science 文献数据并导出 CSV
前端·爬虫·python
徐小夕4 小时前
PDF无限制预览!Jit-Viewer V1.5.0开源文档预览神器正式发布
前端·vue.js·github
WangJunXiang64 小时前
Haproxy搭建Web群集
前端
吴声子夜歌4 小时前
Vue.js——自定义指令
前端·vue.js·flutter
小芝麻咿呀4 小时前
vue--面试题第一部分
前端·javascript·vue.js