风流与netcoreapp2.0

Suave with netcoreapp2.0

我一直在关注这个 Suave 教程: https://legacy.gitbook.com/book/theimowski/suave-music-store/details

总的来说,这看起来不错。但是,我试图让它与 Linux 一起工作,由于某种原因,当 TargetFramework 设置为 "net461"(未找到目标框架)时,我无法用代码编译它,所以我尝试将其更改为"netcoreapp2.0"。它编译了,但后来我遇到了一个问题: https://theimowski.gitbooks.io/suave-music-store/content/en/css.html

最后它说要添加一个 WebPart: pathRegex "(.*)\.(css|png)" >=> Files.browseHome

这对我来说失败了。所有编译,但我得到

This page isn’t working localhost didn’t send any data.

我看了一下Suave的源码,原来"Files.browseHome"在"ctx.runtime.homeDirectory"下搜索了一个文件。

我注意到这在我的机器上设置为: /home/<my_user_name>/.nuget/packages/suave/2.2.1/lib/netstandard1.6 显然,那不是我的项目目录,所以难怪它找不到文件。

我的问题是:我应该怎么做才能让我的 Suave 应用程序使用 Files.browseHome 正确处理我的 css/png 文件?

编辑: 刚刚发现将 WebPart 替换为: pathRegex "(.*)\.(css|png)" >=> Files.browse "/home/<my_username>/<path_to_my_project>/bin/Debug/netcoreapp2.0/" 工作正常,但看起来很难看。知道如何让它变得更好吗?基本上我不想被迫在任何地方硬编码绝对路径。

我认为答案可以在 https://suave.io/files.html 中找到,建议创建如下配置:

let config =
  { defaultConfig with homeFolder = Some (Path.GetFullPath "./public") }

Path.GetFullPath 返回的路径将取决于您的应用启动时看到的当前工作目录(这又取决于您启动应用的方式:从命令行,从systemd 单元文件等)这里可能的变量太多,我无法为您提供准确的说明,但如果您的启动方法可以 cd 进入适当的文件夹,然后再启动您的 Suave 服务器,那么应​​该可以解决你的问题。

如果您运行难以正确设置当前工作目录,那么您可以在配置中硬编码完整路径:

let config =
  { defaultConfig with homeFolder = Some "/home/<your_username>/<path_to_your_project>/bin/Debug/netcoreapp2.0/" }

但这有点丑陋,而且不太便携(部署应用程序后,您必须再次修改该路径)。因此,我建议确保您的启动脚本对正确位置执行 cd,然后使用具有相对路径的 Path.GetFullPath 的方法。或者,您可以拥有一个在应用程序启动时读取的配置文件,您可以在其中指定主路径,或者将其作为环境变量传递……各种可能性。只需确保您的代码可以在启动时收到一些指定正确 "home" 文件夹的信息,然后将其放入您的 Suave 配置中,如我所展示的,这应该可以解决问题。