我的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;来解决这个问题,但我仍然非常确定该模板应该是开箱即用的。
答案 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/
我想这与切斯特所说的相似,但是以不同的方式完成。