dotnet run file 里的两种特殊文件
Intro
在 dotnet 单文件 C# 支持里有两个特殊的文件可以控制 dotnet 运行时的配置,类比到 ASP.NET Core 项目里就是 launchSettings.json 和 appsettings.json 两个文件
Sample
测试代码如下:
api.cs 文件内容如下:
#:sdk Microsoft.Net.Sdk.Web
#:package WeihanLi.Web.Extensions@2.3.0
#:property PublishAot=false
using WeihanLi.Web.Extensions;
var app = WebApplication.Create(args);
app.MapGet("/", () => "Hello World!");
app.MapConfigInspector();
app.Run();
这里引用我自己写的一个 nuget 包,来方便进行后续对配置的一个测试,可以参考之前文章的介绍:动手造轮子 -- 实现一个配置检查器
执行 dotnet api.cs 输出结果如下:
此时是没有任何 launchSettings.json 和 appsettings.json 配置的,我们在同一目录下新增同名的
-
• api.run.json对应着launchSettings.json -
• api.settings.json对应着appsettings.json
api.run.json 配置文件内容如下:
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://file-api.dev.localhost:5149",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
api.settings.json 配置文件内容如下:
{
"AppSettings": {
"Service": "file-api"
}
}
然后我们来再跑一下我们的 api.cs 来试一下看看
从控制台输出的信息可以看到和之前相比已经有了一些变化, launch settings 配置会我们的 api.run.json 配置中加载了,绑定的 url 也变了从之前的 5000 端口变成了 5149 而且这里我们使用 dotnet 10 里的一个新特性,可以使用 *.localhost 域名了,在升级 .NET 10 的时候可以考虑加上一个服务名字来更好的分辨不同的服务
我们再从浏览器上试一下新的地址
我们再来通过自定义 config-inspector 来访问下我们自定义的 config 看看能不能访问到来看是不是有加载自定义的配置,我们访问 http://file-api.dev.localhost:5149/config-inspector/AppSettings:Service
可以看到我们的配置已经加载了,并且从 provider 信息可以看出来配置来自 api.settings.json
那么是否支持 appsettings.Development.json 配置呢,我们可以试一下再加一个 api.settings.Development.json 的配置文件,配置文件内容如下:
{
"AppSettings": {
"Service": "file-api-dev"
}
}
我们再来重新跑一下再访问一下这个 config 试一下
从上面的结果可以看出我们的 api.settings.Development.json 也被加载了,说明是支持 appsettings[.Environment].json 的配置的
More
从前面的输出结果我们可以看出我们的 content root 就是 api.cs 所在目录,我们也可以去写 razor pages 或 Blazor 或者结合前端的 SPA 来一起用,这里我们可以试一下,返回一个 index.html
新建一个 webapp.cs 文件内容如下:
#:sdk Microsoft.Net.Sdk.Web
var app = WebApplication.Create(args);
app.UseFileServer();
app.Run();
然后在同一目录下先建一个 wwwroot 目录然后建一个 index.html,内容比较简单如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hello World</title>
</head>
<body>
<h1>Hello dotnet run file!</h1>
</body>
</html>
接着我们来执行一下 dotnet webapp.cs,接着访问一下
更多用法可以参考 Damian 的这个仓库里的一些例子
https://github.com/DamianEdwards/runfile

