代码之家  ›  专栏  ›  技术社区  ›  LA.27

F#在Linux上-目标是net4xx

  •  3
  • LA.27  · 技术社区  · 7 年前

    我的Linux Mint(18.3)机器上安装了mono(5.10.1.20)和dotnet core(2.1.4)。

    我想使用VS代码Ionide创建一个项目:Ctrl+Shift+P->F#:新建项目->安慰这没有问题。然而,当我尝试构建它时,我得到:

    错误MSB3644:框架的引用程序集 找不到“.NETFramework,版本=v4.6.1”。要解决此问题, 安装此框架版本的SDK或目标包,或 将应用程序重定目标为要为其 安装SDK或目标包。

    我看看我的。fsproj文件,实际上,它说:

    <TargetFramework>net461</TargetFramework>
    

    然而,我在网上发现了一些文章,人们声称可以毫无问题地构建它(例如,这里的Suave Music Store教程:

    https://legacy.gitbook.com/book/theimowski/suave-music-store/details )

    我肯定错过了什么。因此,我的问题是:到底是什么(以及如何实现这一点)?

    PS:通过将目标框架更改为“netcoreapp2.0”,我可以稍微解决这个问题,但我仍然非常确定模板应该是现成的。

    3 回复  |  直到 7 年前
        1
  •  3
  •   Chester Husk    7 年前

    另一个答案是设置FrameworkPathOverride MsBuild参数。所需的程序集已经包含在Mono中,您可以通过设置FrameworkPathOverride来告诉编译器在哪里找到它们。您可以通过包括 netfx.props 文件位于此处: https://github.com/fsprojects/FSharp.TypeProviders.SDK/blob/master/netfx.props 。您可以将其下载到您的repo,然后将以下行添加到所有项目文件中:

    <Import Project="..\netfx.props" />

    这就是几个项目所做的。一旦MSBuild也更改为在这里查看,或者正式的nuget包出现,我预计许多FSharp项目都会切换到这些方法之一。

        2
  •  1
  •   Ody    7 年前

    问题是你没有。NET Framework引用程序集。编译器需要它们来了解。NET Framework API您的代码引用。

    好消息是,您可以通过nuget获取这些引用程序集

    坏消息是它还没有在nuget上发布。org,因此需要将myget提要添加到项目中

    要解决此问题,请将以下内容添加到 fsproj

    <ItemGroup Condition="'$(TargetFramework)' == 'net461'">
        <PackageReference 
              Include="Microsoft.TargetingPack.NETFramework.v4.6.1" 
              Version="1.0.1" ExcludeAssets="All" PrivateAssets="All" />
    </ItemGroup>
    

    然后您需要添加 Nuget.Config 文件到您的项目

    <configuration>
     <packageSources>
        <add key="dotnet-core" value="https://dotnet.myget.org/F/dotnet-core/api/v3/index.json" />
     </packageSources>
    </configuration>
    

    有了这些,您应该能够在Linux上构建net461 EXE和DLL

        3
  •  0
  •   LA.27    7 年前

    谢谢大家的回复,让我发布一些我自己发现的东西。 我计算出在我的构建中添加以下行。sh script也会做这项交易: export FrameworkPathOverride=$(dirname $(which mono))/../lib/mono/4.5/ 我想这和切斯特说的很相似,但做的方式有点不同。