首页 > 解决方案 > 如何生成 F# 签名文件(没有 Visual Studio)

问题描述

我在 MacOS 上使用 JetBrains Rider 并尝试使用 Scott Wlaschin 的代码域建模功能化

这是我的模块定义及其依赖项:

module internal DomainModeling.Domain.PlaceOrderWorkflow.Internal

open DomainModeling.Domain.Api
open DomainModeling.Domain.Primitives
open DomainModeling.Domain.Utils

我想从此模块生成签名文件。但我对使用 dotnet builder 或 fsharp 编译器感到困惑。如果我使用 dotnet 命令,我无法传递标志--sig 但是如果我使用 fsharp 编译器这样

fsharpc src/PlaceOrderWorkflow.fs --sig:PlaceOrderWorkflow.fsi

我得到编译器错误。我想是因为它不知道我的依赖关系。像这样的错误

error FS0039: The namespace or module 'DomainModeling' is not defined.

那么,请告诉我在这种情况下如何生成 *.fsi ?

标签: macosf#

解决方案


您很可能会收到此错误,因为您没有将所有源文件传递给 F# 编译器,而只传递了一个文件。要生成 F# 接口文件,编译器需要处理整个项目,因此您需要调用fsharpc所有源文件,还需要引用您所依赖的所有库。如果您的项目不重要,这可能会非常困难。

但是,您可以--sig在普通fsproj项目文件中指定参数。我刚刚对此进行了测试,它似乎也可以与 .NET Core 一起使用。您可以通过添加OtherFlags参数来做到这一点:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>
  </PropertyGroup>    
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DefineConstants>TRACE</DefineConstants>
    <PlatformTarget>AnyCPU</PlatformTarget>
    <OtherFlags>--sig:test.fsi</OtherFlags>
  </PropertyGroup>    
  <ItemGroup>
    <Compile Include="Program.fs" />
  </ItemGroup>   
</Project>

当我指定它并使用运行我的项目dotnet run或使用构建它时dotnet build,它会生成test.fsi包含所有接口的文件。(这是针对整个项目的,但我认为没有办法将其限制为单个文件的接口。)


推荐阅读