我如何开始使用 Bolero!





0/5 (0投票)
首次尝试安装 Bolero(一个用于 F# 的 Webassembly 框架)时遇到的问题和成功经验
背景
首先要知道我正在安装一个 Webassembly 框架。因此,目标是使用 F#/HTML 编写一个页面。并在后台运行一些 .dll。读者需要自行判断这对于特定任务是否有用。
安装框架
安装框架很容易。就像 https://fsbolero.io 建议的那样。
我去了 https://dotnet.microsoft.com/download/dotnet-core/3.0 并下载了 SDK 3.0.100-preview7-012821。那是当时可用的最高版本。在 Windows 组中安装了 .NET Core Installer: x64。(好吧。第一次我不小心下载了 mac 版本,它的扩展名是 .pkg。尝试了几分钟找出如何/在哪里将 .pkg 添加到 Visual Studio 2017 后,我猜测它应该只能从控制台运行……然后才发现我的错误并下载了 .exe)
运行 Dotnet 命令
之后,我打开 cmd 并运行以下命令。
安装项目模板
dotnet new -i Bolero.Templates
(0.5.28-preview*
是模板的实际版本。)
创建一个项目
dotnet new bolero-app -o Atrium
(Atrium
是我的新 Web 项目的名称。)
构建并运行
cd Atrium
dotnet build
现在出现了一些复杂情况(我省略了实际的完整路径,用“...”表示)>
Restore completed in 300,97 ms for e:\...\Atrium\src\Atrium.Client\Atrium.Client.fsproj.
Restore completed in 513,38 ms for e:\...\Atrium\src\Atrium.Server\Atrium.Server.fsproj.
You are using a preview version of .NET Core. See: https://aka.ms/dotnet-core-preview
You are using a preview version of .NET Core. See: https://aka.ms/dotnet-core-preview
Atrium.Client -> e:\...\Atrium\src\Atrium.Client\bin\Debug\netstandard2.0\Atrium.Client.dll
...
EXEC : error : Could not load type 'System.Text.Json.Serialization.JsonSerializerOptions'
from assembly 'System.Text.Json, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=cc7b13ffcd2ddd51'.
[e:\todelete\Atrium\src\Atrium.Client\Atrium.Client.fsproj]
at Microsoft.AspNetCore.Blazor.Build.BootJsonWriter.GetBootJsonContent
(String assemblyFileName, String entryPoint, String[] assemblyReferences,
IEnumerable`1 embeddedContent, Boolean linkerEnabled)
at Microsoft.AspNetCore.Blazor.Build.BootJsonWriter.WriteFile
(String assemblyPath, String[] assemblyReferences, String[] embeddedResourcesSources,
Boolean linkerEnabled, String outputPath)
at Microsoft.AspNetCore.Blazor.Build.DevServer.Commands.WriteBootJsonCommand.
<>c__DisplayClass0_0.<Command>b__0()
C:\Users\MR-TaNk\.nuget\packages\microsoft.aspnetcore.blazor.build\
3.0.0-preview6.19307.2\targets\Blazor.MonoRuntime.targets(633,5): error MSB3073:
The command "dotnet "C:\Users\MR-TaNk\.nuget\packages\microsoft.aspnetcore.blazor.build\
3.0.0-preview6.19307.2\targets\../tools/Microsoft.AspNetCore.Blazor.Build.dll"
write-boot-json "obj\Debug\netstandard2.0\Atrium.Client.dll"
--references "e:\...\Atrium\src\Atrium.Client\obj\Debug\netstandard2.0\blazor\
bootjson-references.txt" --embedded-resources
"e:\...\Atrium\src\Atrium.Client\obj\Debug\netstandard2.0\blazor\embedded.resources.txt"
--linker-enabled --output
"e:\...\Atrium\src\Atrium.Client\obj\Debug\netstandard2.0\blazor\blazor.boot.json""
exited with code 1. [e:\...\Atrium\src\Atrium.Client\Atrium.Client.fsproj]
Build FAILED.
EXEC : error : Could not load type 'System.Text.Json.Serialization.JsonSerializerOptions'
from assembly 'System.Text.Json, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=cc7b13ffcd2ddd51'. [e:\todelete\Atrium\src\Atrium.Client\Atrium.Client.fsproj]
C:\Users\MR-TaNk\.nuget\packages\microsoft.aspnetcore.blazor.build\
3.0.0-preview6.19307.2\targets\Blazor.MonoRuntime.targets(633,5): error MSB3073:
The command "dotnet "C:\Users\MR-TaNk\.nuget\packages\microsoft.aspnetcore.blazor.build\
3.0.0-preview6.19307.2\targets\../tools/Microsoft.AspNetCore.Blazor.Build.dll"
write-boot-json "obj\Debug\netstandard2.0\Atrium.Client.dll" --references
"e:\...\Atrium\src\Atrium.Client\obj\Debug\netstandard2.0\blazor\bootjson-references.txt"
--embedded-resources
"e:\...\Atrium\src\Atrium.Client\obj\Debug\netstandard2.0\blazor\embedded.resources.txt"
--linker-enabled --output
"e:\...\Atrium\src\Atrium.Client\obj\Debug\netstandard2.0\blazor\blazor.boot.json""
exited with code 1. [e:\...\Atrium\src\Atrium.Client\Atrium.Client.fsproj]
0 Warning(s)
2 Error(s)
Time Elapsed 00:00:09.70
现在该怎么办?让我们看看如何调试问题。我的工具有哪些(哪些 IDE 支持 Bolero)。
Visual Studio 设置 No. 1
我个人偏爱 Visual Studio,但我从 FSharp Slack 中看到的大多是 Visual Studio Code。在 .NET Core 的下载页面
Supports Visual Studio 2019 (v16.1, latest preview)
所以我们来下载它。当时我的互联网连接非常慢,所以我尝试最小化下载的组件
只选择了 .NET Core 3.0 SDK、F# 语言支持、Web 项目的 F# 语言支持。其余的都是依赖项。
尝试打开解决方案,结果如下
错误信息是
E:\...\Atrium\src\Atrium.Server\Atrium.Server.fsproj : error : Unrecognized Guid format.
上次服务器无法正确加载时,我不得不以管理员模式重新启动 Visual Studio。这次没有奏效。
我在 Google 搜索这个问题时,找到了一些文章
https://stackoverflow.com/a/33813249
https://stackoverflow.com/a/54578428
- 点击“程序疑难解答”
- 勾选“程序打开但显示不正确”
在“程序打开但显示不正确”之后,出现了一个菜单,我无法选择任何有用的选项来描述我的问题。所以我放弃了尝试。
- 浏览到 HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
- 删除 Visual Studio 条目
乍一看,这显然是 VS 兼容性问题。regedit
中甚至没有键条目,所以我又 Google 了一下。大多数关于兼容性问题的搜索结果都是关于“升级 Windows 后”或“升级 Visual Studio 后”,但我没有这种情况。
好的。它不是 Paket
。或者它是?我感到困惑。
- https://github.com/dotnet/fsharp/issues/3393
- https://github.com/dotnet/fsharp/pull/3463/commits/1bceae4ec1791ccd18f07e584dafaa2b646e1d85
也许项目格式没有跟上最新版本。我去了 https://www.guidgenerator.com/online-guid-generator.aspx。勾选了 Uppcase、括号并生成了新的 GUID。修改了 e:\...\Atrium\src\Atrium.Server\Atrium.Server.fsproj,像这样
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Compile Include="Startup.fs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Atrium.Client\Atrium.Client.fsproj" />
<PackageReference Include="Bolero.Server" Version="0.6.3-preview*" />
<PackageReference Include="Microsoft.AspNetCore.Blazor.Server" Version="3.0-preview6.*" />
</ItemGroup>
</Project>
to
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Compile Include="Startup.fs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Atrium.Client\Atrium.Client.fsproj" >
<Name>Atrium.Client</Name>
<Project>{DA3D64BB-78FA-4241-9BD7-733D3C253630}</Project>
</ProjectReference>
<PackageReference Include="Bolero.Server" Version="0.6.3-preview*" />
<PackageReference Include="Microsoft.AspNetCore.Blazor.Server" Version="3.0-preview6.*" />
</ItemGroup>
</Project>
现在我可以加载项目了。我将它设置为启动项目并尝试运行。它弹出一个带有异常的屏幕并关闭。我以闪电般的速度使用 Ctrl - A,Ctrl - C,检查了异常
Application startup exception: System.IO.DirectoryNotFoundException:
E:\...\Atrium\src\Atrium.Client\bin\Debug\netstandard2.0\dist\
at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor
(String root, ExclusionFilters filters)
at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root)
at Microsoft.AspNetCore.Builder.BlazorHostingApplicationBuilderExtensions.
UseClientSideBlazorFiles(IApplicationBuilder app, String clientAssemblyFilePath)
at Microsoft.AspNetCore.Builder.BlazorHostingApplicationBuilderExtensions.
UseClientSideBlazorFiles[TClientApp](IApplicationBuilder app)
at Atrium.Server.Startup.Configure(IApplicationBuilder app, IWebHostEnvironment env)
in E:\todelete\Atrium\src\Atrium.Server\Startup.fs:line 71
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments,
Signature sig, Boolean constructor, Boolean wrapExceptions)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj,
BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke
(Object instance, IApplicationBuilder builder)
at Microsoft.AspNetCore.Hosting.ConfigureBuilder.
<>c__DisplayClass4_0.<Build>b__0(IApplicationBuilder builder)
at Microsoft.AspNetCore.Hosting.ConventionBasedStartup.Configure(IApplicationBuilder app)
at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.
<>c__DisplayClass0_0.<Configure>g__MiddlewareFilterBuilder|0(IApplicationBuilder builder)
at Microsoft.AspNetCore.HostFilteringStartupFilter.
<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder app)
at Microsoft.AspNetCore.Hosting.WebHost.BuildApplication()
crit: Microsoft.AspNetCore.Hosting.WebHost[6]
Application startup exception
System.IO.DirectoryNotFoundException:
E:\...\Atrium\src\Atrium.Client\bin\Debug\netstandard2.0\dist\
at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor
(String root, ExclusionFilters filters)
at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root)
at Microsoft.AspNetCore.Builder.BlazorHostingApplicationBuilderExtensions.
UseClientSideBlazorFiles(IApplicationBuilder app, String clientAssemblyFilePath)
at Microsoft.AspNetCore.Builder.BlazorHostingApplicationBuilderExtensions.
UseClientSideBlazorFiles[TClientApp](IApplicationBuilder app)
at Atrium.Server.Startup.Configure(IApplicationBuilder app, IWebHostEnvironment env)
in E:\todelete\Atrium\src\Atrium.Server\Startup.fs:line 71
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments,
Signature sig, Boolean constructor, Boolean wrapExceptions)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr,
Binder binder, Object[] parameters, CultureInfo culture)
at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke
(Object instance, IApplicationBuilder builder)
at Microsoft.AspNetCore.Hosting.ConfigureBuilder.
<>c__DisplayClass4_0.<Build>b__0(IApplicationBuilder builder)
at Microsoft.AspNetCore.Hosting.ConventionBasedStartup.Configure(IApplicationBuilder app)
at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.
<>c__DisplayClass0_0.<Configure>g__MiddlewareFilterBuilder|0(IApplicationBuilder builder)
at Microsoft.AspNetCore.HostFilteringStartupFilter.
<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder app)
at Microsoft.AspNetCore.Hosting.WebHost.BuildApplication()
所以我必须下载 .netcore 2?那个版本没有带 .exe 扩展名的安装程序。所以我尝试了最新的 2. 可用版本 2.2。它没有解决我的问题。我甚至尝试写入
<TargetFramework>netcoreapp2.2</TargetFramework>
在 E:\...\Atrium\src\Atrium.Server\Atrium.Server.fsproj 中。
1>C:\Program Files\dotnet\sdk\3.0.100-preview9-014004\Sdks\Microsoft.NET.Sdk\
targets\Microsoft.PackageDependencyResolution.targets(234,5): error NETSDK1005:
Assets file 'E:\...\Atrium\src\Atrium.Server\obj\project.assets.json'
doesn't have a target for '.NETCoreApp,Version=v2.2'.
Ensure that restore has run and that you have included 'netcoreapp2.2'
in the TargetFrameworks for your project.
检查 E:\...\Atrium\src\Atrium.Server\obj\project.assets.json 后,我没有发现任何与它应该用 2.2 编译相关的东西。然后尝试构建 Atrium.Client
项目。
Could not load type 'System.Text.Json.Serialization.JsonSerializerOptions'
from assembly 'System.Text.Json, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=cc7b13ffcd2ddd51
这和dotnet
命令的错误是一样的。后来,我不知怎么地碰到了以下帖子
其中突出显示了以下内容
引用.NET Core 3.0 中的 ASP.NET 移除了 JSON.NET 依赖项,但如果你愿意,仍然可以通过一行代码将其添加回来。
为了将其添加回来(并向 Bolero
的维护者提交更改请求),我必须以某种方式加载项目并添加 nuget。但是,我仍然有那么多黄色三角形的 nuget 引用,
所以我们尝试另一种方法。
Visual Studio Code 设置
我下载了 Visual Studio Code Insiders 并使用了 Ionide。使用 Code 和 Ionide 是来自 F# 社区(来自 Slack)的另一个提示。我曾希望有一些类似项目结构的东西,但我只能得到 Open folder...。我快速安装了 Vim 键盘设置和快捷键。安装 Ionide-fsharp 后,打开 E:\...\Atrium 后,以下菜单变为活动状态。
太棒了!现在调试项目
Exception has occurred: CLR/System.ArgumentException
An exception of type 'System.ArgumentException' occurred in System.IO.FileSystem.Watcher.dll
but was not handled in user code: 'The directory name
'c:\...\Atrium\src\Atrium.Server\bin\Debug\Atrium.Client' does not exist.'
at System.IO.FileSystemWatcher.CheckPathValidity(String path)
at System.IO.FileSystemWatcher..ctor(String path, String filter)
at Bolero.Templating.Server.Impl.Watcher.Start() at
Bolero.Templating.Server.ServerTemplatingExtensions.UseHotReload
(IApplicationBuilder this, FSharpOption`1 urlPath)
at Atrium.Server.Startup.Configure(IApplicationBuilder app, IWebHostEnvironment env)
in c:\Marci cuccok\Atrium\src\Atrium.Server\Startup.fs:line 75
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments,
Signature sig, Boolean constructor, Boolean wrapExceptions)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr,
Binder binder, Object[] parameters, CultureInfo culture)
at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance,
IApplicationBuilder builder)
at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.
<Build>b__0(IApplicationBuilder builder)
at Microsoft.AspNetCore.Hosting.ConventionBasedStartup.Configure(IApplicationBuilder app)
一段时间后,我升级到 Bolero 0.8。我按照安装步骤,重新下载了最新的 .NET Core 3.0 SDK 和项目。检查 dotnet build,没有异常,服务器启动了。所以 是 JSON 的破坏性更改。一段时间后,我还注意到显示热重载功能的 gif
那肯定是 Visual Studio 非代码。
Visual Studio 设置 No. 2
我试图查看 gif
,看能否看出 Loïc 使用的是哪个 Visual Studio
版本(Community
/Pro
/Enterprise
),但无法猜测。我相信 Bolero 正在使用一些只有非 Community
Visual Studio
才有的功能。
更新 Bolero 仓库后,开始出现新的异常
C:\Program Files\dotnet\sdk\3.0.100-preview8-013656\Sdks\Microsoft.NET.Sdk\
targets\Microsoft.PackageDependencyResolution.targets(234,5):
error NETSDK1004: Assets file 'E:\...\Atrium\src\Atrium.Server\obj\project.assets.json'
not found. Run a NuGet package restore to generate this file.
运行 E:\...\Atrium\dotnet restore 甚至出现了其他异常
A fatal error has occurred and debugging needs to be terminated. The
debugger was configured to use the Desktop CLR (.NET Framework)
Managed debugger, but the target process loaded the CoreCLR (.NET
Core) runtime. To debug this project, configure it to use the 'Managed
(CoreCLR)' debugger.
Google 搜索异常,提示如下
引用嗨 MrGoodkat47,
很抱歉延迟回复。
由于有些错误可能由多种情况引起,所以有时我们需要手动排除故障,对此造成的不便深表歉意。
对于此错误,请确认您的机器上是否已安装相应的 .Net Core Runtime。
此外,请转到项目属性|调试,然后启用“启用本机代码调试”。
但我没有这样的东西
在网上搜索如何启用这个托管的 CoreCLR,以下链接帮助我启动了调试器
按照提示,我能够将调试器附加到正在运行的服务器。
请注意,“启动”按钮不使用此方法。我必须将调试器附加到正在运行的服务器,该服务器由 E:\...\Atrium\src\Atrium.Server\dotnet run 运行。
最终的解决方案来自这个 Stackoverflow 答案
引用我还添加了以下 VS 工作负载
- ASP.NET 和 Web 开发
安装 Web 开发后,netcoreapp2.2 自动随之而来。我可以撤销所有项目文件更改并重新下载空项目。一切都完美地从模板(更新的 Visual Studio)中运行。
同时启用本机代码调试也可用(请注意,Visual Studio 比 MSDN 帖子截图中的版本更新,并且有更多选项。开发非常棒)
我可以调试服务器调用。用 F5 运行我的应用程序。一切都很好。
重温最新版本
在安装了 .NET 5.0.100-rc.1.20452.10 和 Bolero 0.15.23 以及 Visual Studio Community 2019 16.7.5 之后,我尝试了如果移除 ASP.NET 和 Web 开发功能(当时最新版本)会发生什么。我可以在不添加 3 GB 的额外设置(如果你选择下载,这无疑会让你更轻松)的情况下调试服务器调用。
关注点
献给那些喜欢尝试新技术,并且不怕弄脏手的同志们。
历史
- 2020 年 10 月 2 日:初始版本