2017-06-30 32 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

    相關問題