2017-06-30 44 views
3

我注意到添加软件包有时会破坏我的代码。诸如Seq.replicate和之类的函数正在工作中会得到红色波浪线并且程序不再运行。这里是一个应该重现问题的详细过程(我正在使用VS Community Edition 2017):为什么添加一些软件包会破坏我的代码?

1)创建一个项目。

2)Program.fs包含代码:

[<EntryPoint>] 
let main argv = 
    printfn "%A" argv 
    0 // return an integer exit code 

3)添加的两行代码如下:

[<EntryPoint>] 
let main argv = 
    let repla = Seq.replicate 10 "A" 
    printfn "%A" (repla |> List.ofSeq |> List.take 5) 
    printfn "%A" argv 
    0 // return an integer exit code 

3)命中Ctrl+F5,程序运行没有任何问题。

4)右键点击Solution Explorer上的References。点击Manage Nuget Packages...

5)点击Browse

6)搜索Newtonsoft.Json并安装它。

7)点击Ctrl+F5,程序运行没有任何问题。控制台打印

["A"; "A"; "A"; "A"; "A"] 
[||] 

8)继续如步骤4至6,并使用Nuget安装包MathNet.Numerics

9)点击Ctrl+F5,程序运行没有任何问题。控制台打印

["A"; "A"; "A"; "A"; "A"] [||]

10)继续,如步骤4至6,并使用Nuget安装包MathNet.Numerics.FSharp

11)点击Program.fs标签。可怕的红色波浪线出现在Seq.replicate and List.take`下。

12)命中Ctrl+F5。一个对话框弹出以下消息:

There were build errors. Would you like to continue and run the last successful build? 

问题:

一)究竟是怎么回事?

b)这是一个与MathNet.Numerics.FSharp中的问题或者安装的软件包的特定组合或安装顺序相关的独立案例吗?或者这是一个常见问题?

c)在使用Nuget时可以避免这个问题吗?

d)如果没有,是否可以通过其他方式安装(而不是Nuget)来避免此问题?

+1

你安装什么版本的软件包? – mydogisbox

+1

(1)红色波浪下的错误是什么? (2)你有没有注意到,如果安装'MathNet.Numerics.FSharp'已经导致安装任何_other_软件包(由于是传递依赖)? –

+0

@FyodorSoikin - 红色波浪下的错误是'值,构造函数,命名空间或类型'replicate'is not defined'。当安装'MathNet.Numerics.FSharp'时,它也会安装'FSharp.Core.3.1.2.5'。 – Soldalma

回答

3

嗯,我认为OP的担忧有些有效。我不鼓励手工编辑fsproj文件。此外,注释也非常有效,Paket是一个很好的工具,可以简化VS和代码中的依赖管理。因此,这里有一个非常简单的两部分答案,其中a)您可以使用块实际上使您的解决方案工作,而无需手动编辑项目文件,以及b)快速了解如何在VS上使用问题解答。

这个问题,其中一些软件包下载和旧的依赖关系混淆了其他代码时有发生,可能是由于依赖于最小可行版本的策略。你的问题有点类似于这个问:Why can't I get suave to work

下面是使用只是金块最简单的办法:

  1. 打开与fsharp控制台项目
  2. 一个新的解决方案。在这一点上你的Fsharp.Core在VS2017将是4.1:

enter image description here

  1. 现在通过nugget添加Mathnet.Numerics.Fsharp:

enter image description here

现在,非常遗憾的是你有降级到F#3.1

  • 这是不行的,所以只通过金块得到Fsharp.Core以及!
  • enter image description here

  • 瞧,你又回到了一个有效的解决方案,而无需编辑fsproj。基本上你所要做的就是添加Fsharp.Core包。你可能也改变了.NET框架选项的属性,并将其与Fsharp 4.1迁移到.NET 4.7:
  • enter image description here

    现在对于一揽子贷款(顺便说一句,在一揽子贷款插件答案的第2部分刚得到更新和我测试,它工作正常)。你基本上可以用它来代替金块或直接编辑文件。实际上,您需要使用解决方案根目录中的两个文件paket.dependencies以及项目根目录中的paket.references。将生成Paket.lock。这是一个开始的两步过程。就拿你在上面,并从VS工具菜单刚才提出的项目选择Paket Dependencies Manager,做到Initialize Paket,然后做Convert From Nuget

    enter image description here

    有了这个,你可以跟上的NuGet或使用一揽子贷款项目管理你的依赖,如果你喜欢。接下来,我将把Newtonsoft.JSON添加到引用中。双击paket.dependencies文件并添加以下行:nuget Newtonsoft.Json 10.0.3 restriction: >= net452,您实际上只需要Newtonsoft.Json,但我们不想下载名为.NetCore的整个interweb。还要将这一行添加到paket.references(您可以在项目浏览器中单击它):Newtonsoft.Json。并运行工具| Paket |安装:

    Paket.dependencies:

    enter image description here

    Paket.references:

    enter image description here

    和润PAKET安装:

    enter image description here

    并且您将安装Newtonsoft.JSON。通常你不需要指定一个框架限制的版本,然而它有一些你可能不想要的预发布包,并且我也假定你不需要.netcore依赖。

    您实际上可以右键单击并尝试从引用“添加包”菜单中安装此包,但是您会碰到依赖性错误。

    enter image description here

    enter image description here

    +1

    非常感谢。高超。我仔细研究了答案的第一部分,当然一切正如你所说的那样。但是我对最后一句话有些困惑:“你也可以改变属性中的.NET Framework选项,并用Fsharp 4.1将它移动到.NET 4.7”我打开了项目属性并看到了一个类似于你的文章的页面。但是在我的屏幕和你发布的页面中都有“.NET Framework 4.5.2”,你提到了“.NET 4.7”。请不要介意这是否是一个愚蠢的问题。我正在学。 – Soldalma

    +1

    关于答案的第二部分,我明白Paket在很多方面都比已经非常出色的Nuget更好。但是在与Paket发生纠纷后,我不得不重新安装VS三次,因为我没有处理我所面临的问题的知识。我想尝试一下你的建议,但是如果有一种方法可以卸载Paket,而无需卸载并重新安装VS,以防事情无法按预期工作,那么这将更容易。那可能吗?我可以使用Git/Bitbucket(这是我使用的)来做到这一点吗? – Soldalma

    +1

    如果你不想要,你不需要使用分页。即它不是一项要求。 paket只是一个exe文件,你可以随时删除.paket文件夹。您也可以从VS的工具菜单中卸载VS paket加载项。 – s952163

    6

    MathNet.Numerics.FSharpFSharp.Core.3.1.2.5有依赖关系,它取代了当前使用的FSharp.Core版本。相当老3.1.2.5缺乏许多功能。

    这发生在其他流行的F#库,如FsCheck以及。我通常将参考文献更改为最新版本FSharp.Core,因为这应该是向后兼容的。

    要做到这一点我卸载F#项目,并更新项目文件到FSharp.Core参考:

    <Reference Include="FSharp.Core"> 
        <Name>FSharp.Core</Name> 
        <AssemblyName>FSharp.Core.dll</AssemblyName> 
        <HintPath>$(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\$(TargetFSharpCoreVersion)\FSharp.Core.dll</HintPath> 
    </Reference> 
    

    然后我重新加载项目。

    由于这是一个相当笨拙的过程,希望更有洞察力的用户会发布更好的解决方案。

    +1

    笨重或不工作。非常感谢。是否有一本书/ PDF /链接教会初学者如何处理项目文件? – Soldalma

    +2

    @Soldalma使用paket ;-) http://fsprojects.github.io/Paket/ Paket为您检查所有这些东西,并允许您明确依赖关系。 – mydogisbox

    +1

    @mydogisbox - 对我来说不是这样。我试过Paket,不得不重新安装VS Studio 2017以摆脱它。同样类型的问题,但更糟。也许是因为我不知道如何使用它。 Paket发布的错误消息对我来说是不可理解的。我无法找到一个对项目,构建等知之甚少的初学者的说明。另外,使用Paket必须处理三个文件,而Nuget只有一个文件。 – Soldalma

    相关问题