为什么 host.json 没有被复制到 F# Azure Functions 项目中的输出?

Why host.json not being copied to output in F# Azure Functions project?

在简单的 F# Azure Functions 项目中 host.json 未被复制到 F# Azure Functions 项目中的输出(相同 local.settings.json),即使在 fsharp-azure-functions-signalr-[=24 中如此指定也是如此=]:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <AzureFunctionsVersion>v3</AzureFunctionsVersion>
    <RootNamespace>fsharp_azure_functions_signalr_problem</RootNamespace>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.SignalRService" Version="1.0.2" />
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.3" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="negotiate.fs" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>

同样的C#项目没有这个问题

我的 F# 项目示例你可以 git clone https://github.com/ed-ilyin/fsharp-azure-functions-signalr-problem.git

没有 host.json 文件我有以下错误:

> func start
...
Microsoft.Azure.WebJobs.Host: Error indexing method 'negotiate'. Microsoft.Azure.WebJobs.Host: Cannot bind parameter 'connectionInfo' to type SignalRConnectionInfo. Make sure the parameter Type is supported by the binding. If you're using binding extensions (e.g. Azure Storage, ServiceBus, Timers, etc.) make sure you've called the registration method for the extension(s) in your startup code (e.g. builder.AddAzureStorage(), builder.AddServiceBus(), builder.AddTimers(), etc.).
...

所以手动复制到编译文件夹可以解决这个问题。我已经测试了 F#,看来问题出在你的 .fsproj 文件中,host.json 的定义应该是这样的:

<Content Include="host.json">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

这对我来说很好。

None 也包括作品:

<None Include="host.json">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

问题已在 this issue 中跟踪。

默认情况下,C# 项目通过通配符包含所有文件。这就是 Update 起作用的原因。在 F# 中,默认情况下不包含任何文件(因为文件顺序很重要)。所以没有什么可更新的。