Linux上的F# - 目标是net4xx

时间:2018-04-08 13:36:39

标签: linux f# mono visual-studio-code .net-core

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

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

  

错误MSB3644:框架的引用程序集   " .NETFramework,版本= v4.6.1"没找到。要解决这个问题,   为此框架版本安装SDK或Targeting Pack   将您的应用程序重新定位到您所使用的框架版本   安装了SDK或Targeting Pack。

我看看我的.fsproj文件确实 - 它说:

<TargetFramework>net461</TargetFramework>

但是,我在网上发现了一些文章,其中人们声称可以毫无问题地构建它(例如,在这里找到Suave-Music-Store教程:

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

我肯定在这里遗漏了一些东西。所以我的问题是:究竟是什么(以及如何使这项工作)?

PS:我能够通过将目标框架更改为&#34; netcoreapp2.0&#34;来解决这个问题,但我仍然非常确定该模板应该是开箱即用的。

3 个答案:

答案 0 :(得分:3)

另一个答案是设置FrameworkPathOverride MsBuild参数。您需要的程序集已包含在Mono中,您可以通过设置FrameworkPathOverride告诉编译器在何处找到它们。您可以通过在此处添加netfx.props文件轻松完成此操作:https://github.com/fsprojects/FSharp.TypeProviders.SDK/blob/master/netfx.props。您可以将其下载到您的仓库,然后将以下行添加到您的所有项目文件中:

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

这是几个项目的作用。一旦MSBuild更改为查看此处,或者正式的nuget包出现,我希望许多FSharp项目切换到其中一种方法。

答案 1 :(得分:1)

问题是您没有.NET Framework参考组件。编译器需要它们才能了解代码引用的.NET Framework API。

好消息是你可以通过nuget

获得这些参考组件

坏消息是它还没有在nuget.org上发布,所以你需要将myget feed添加到你的项目中

要解决此问题,请将以下内容添加到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 exes和dll

答案 2 :(得分:0)

谢谢你们的回复 - 让我发布一些我自己发现的东西。 我发现将以下行添加到我的build.sh脚本中也是如此: export FrameworkPathOverride=$(dirname $(which mono))/../lib/mono/4.5/ 我想这与切斯特所说的相似,但是以不同的方式完成。