Как создать файл подписи F # (без Visual Studio) - PullRequest
0 голосов
/ 09 ноября 2019

Я использую JetBrains Rider на MacOS и экспериментирую с кодом Скотта Влашина Моделирование домена сделано функциональным

Вот определение моего модуля и его зависимости:

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 в этом случае?

1 Ответ

2 голосов
/ 11 ноября 2019

Скорее всего, вы получаете эту ошибку, потому что вы не передали все исходные файлы компилятору 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 со всемиинтерфейсы. (Это для всего проекта, но я не думаю, что есть способ ограничить это интерфейсами для одного файла.)

...