为什么添加一些包会破坏我的代码?

Sol*_*lma 3 f# packages nuget

我注意到添加包有时会破坏我的代码.类似Seq.replicateList.take正在工作的功能得到红色波浪线,程序不再运行.这是一个应该复制问题的详细程序(我正在使用VS Community Edition 2017):

1)创建一个项目.

2)Program.fs包含代码:

[<EntryPoint>]
let main argv =
    printfn "%A" argv
    0 // return an integer exit code
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

4)上单击鼠标右键ReferencesSolution Explorer.点击Manage Nuget Packages....

5)点击Browse.

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

7)命中Ctrl+F5,程序运行没有任何问题.控制台打印

["A"; "A"; "A"; "A"; "A"]
[||]
Run Code Online (Sandbox Code Playgroud)

8)按照步骤4到6进行操作并MathNet.Numerics使用安装包Nuget.

9)命中Ctrl+F5,程序运行没有任何问题.控制台打印

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

10)按照步骤4到6进行操作并MathNet.Numerics.FSharp使用安装包Nuget.

11)单击Program.fs选项卡.在Seq.replicate andList.take` 下出现了可怕的红色波浪线.

12)命中Ctrl+F5.弹出一个对话框,显示以下消息:

There were build errors. Would you like to continue and run the last successful build?
Run Code Online (Sandbox Code Playgroud)

问题:

a)究竟发生了什么?

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

c)使用Nuget时是否可以避免此问题?

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

Jus*_*mer 6

MathNet.Numerics.FSharp有一个依赖项FSharp.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>
Run Code Online (Sandbox Code Playgroud)

然后我重新加载项目.

由于这是一个相当笨重的程序,希望更有洞察力的用户将发布更好的解决方案.

  • @Soldalma使用paket ;-) http://fsprojects.github.io/Paket/ Paket为您检查所有这些东西,并允许您明确依赖关系. (2认同)
  • @Soldalma我最初设置它也遇到了问题.理解它的工作绝对值得付出努力. (2认同)
  • @Soldalma - *另外,使用Paket必须处理三个文件,Nuget只有一个.*一旦你了解为什么Paket将概念分成三个文件,你会在另一个方向抱怨这个:"为什么当NuGet将它们分成不同的文件时,它们会被分成不同的文件吗?:-)能够提交你的`paket.lock`文件,并且知道所有其他开发人员在运行`paket restore`时将完全****相同​​版本的依赖项非常适合一个人的安心, 例如. (2认同)