3

我一直在关注这个 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/" 工作正常,但看起来很难看。知道如何让它变得更好吗?基本上我不想被迫在任何地方硬编码绝对路径。

4

1 回答 1

3

我认为答案可以在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相对路径。或者,您可以在应用程序启动时读取一个配置文件,您可以在其中指定主路径,或者将其作为环境变量传递......各种可能性。只需确保您的代码可以在启动时获得一些指定正确“主”文件夹的信息,然后将其放入您的 Suave 配置中,如我所示,这应该可以解决问题。

于 2018-04-23T02:39:19.717 回答