linux - 风流与netcoreapp2.0

标签 linux f# .net-core suave

我一直在学习这个 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 单元文件等)这里可能的变量太多,我无法为您提供准确的说明,但是如果您的启动方法可以在启动 Suave 之前将 cd 放入适当的文件夹服务器,那么这应该可以解决您的问题。

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

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

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

关于linux - 风流与netcoreapp2.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49971219/

相关文章:

.net - F# 实际上将私有(private)成员编译为 IL 中的内部成员。漏洞?

.net - 有没有办法在 F# 中使用 Matlab 图像处理工具箱?

c++ - Linux 上的 .NET Core - 编码(marshal)结构

c# - 在 Signalr .net 核心中——应该在哪里进行验证?

linux - 进程终止时丢弃打开的文件

c++ - 好的 Linux/Ubuntu OpenGL 教程?

linux - FFprobe 检查流链接

linux - Pthread互斥断言错误

c# - 在 LINQPad 中编写 F# 查询

entity-framework - 从 dotnet 核心使用的硬编码 EF6 连接字符串名称