我一直在关注这个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 workinglocalhost 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返回的路径将取决于您的应用程序启动时所看到的当前工作目录(这又取决于您如何启动该应用程序:从命令行,从系统化的单位文件等)。这里给我提供了太多可能的变量,无法为您提供确切的说明,但是如果您的启动方法可以在启动Suave服务器之前将cd放入适当的文件夹中,那么应该可以解决您的问题。

如果您在正确设置当前工作目录时遇到困难,则可以在配置中硬编码完整路径:
let config =
  { defaultConfig with homeFolder = Some "/home/<your_username>/<path_to_your_project>/bin/Debug/netcoreapp2.0/" }

但这有点丑陋,而且不是真正可移植的(部署应用程序后,您必须再次修改该路径)。因此,我建议您确保启动脚本在正确的位置执行cd,然后将Path.GetFullPath与相对路径一起使用的方法。或者,您可以拥有一个配置文件,该文件可以在应用启动时被读取,您可以在其中指定主路径,或者将其作为环境变量传递给其他人。只要确保您的代码可以在启动时交给一些信息,这些信息会指定正确的“home”文件夹,然后按照我的说明将其放入Suave配置中,这应该可以解决。

10-05 23:50