在f#脚本中执行c#代码具有意外行为

时间:2016-11-22 20:07:45

标签: f# nuget nuget-package f#-fake

我有一个F#假脚本,它与Nuge.Core一起提取包文件。如果我尝试使用c#console app执行此操作,一切正常。但是,如果我在f#fake脚本中执行完全相同的脚本,则它无效。这里有很多依赖项,我不知道在哪里寻求帮助:docker.dotnetfakef#nuget.core

要重现此操作,您需要下载Docker.DotNet.2.124.3.nupkg

对于c#示例,您需要控制台应用程序并安装nuget.core nuget包。这很有效!

class Program
{
    static void Main()
    {
        var zip = new NuGet.ZipPackage(@"Docker.DotNet.2.124.3.nupkg");
        foreach (var file in zip.GetFiles())
        {
            System.Console.WriteLine(file.Path);
        }
    }
}

对于f#示例,您需要并排显示这两个文件: https://gist.github.com/mynkow/e6f0e550fcacc268dd1e9b743e17d344

ERROR:

    ==============================================================================
FsiEvaluationException:

Error: System.InvalidOperationException: 'NETStandard.Library' already has a dependency defined for 'Microsoft.NETCore.Platforms'.
           at NuGet.Manifest.ValidateDependencySets(IPackageMetadata metadata)
           at NuGet.Manifest.Validate(Manifest manifest)
           at NuGet.Manifest.ReadFrom(Stream stream, IPropertyProvider propertyProvider, Boolean validateSchema)
           at NuGet.LocalPackage.ReadManifest(Stream manifestStream)
           at NuGet.ZipPackage.EnsureManifest(Func`1 manifestStreamFactory)
           at NuGet.ZipPackage..ctor(String filePath, Boolean enableCaching)
           at <StartupCode$FSI_0005>.$FSI_0005_Test$fsx.main@() in C:\Users\mynkow\Desktop\Reproduce\test.fsx:line 12
        Stopped due to error


Output: [Loading C:\Users\mynkow\Desktop\Reproduce\test.fsx]
        ==============================================================================


Input: C:\Users\mynkow\Desktop\Reproduce\test.fsx
\Arguments:
  C:\fsi.exe

Exception: Yaaf.FSharp.Scripting.FsiEvaluationException: Error while compiling or executing fsharp snippet. ---> System.Exception: Operation failed. The error text has been print the error stream. To return the corresponding FSharpErrorInfo use the EvalInteractionNonThrowing, EvalScriptNonThrowing or EvalExpressionNonThrowing
   at Microsoft.FSharp.Compiler.Interactive.Shell.FsiEvaluationSession.commitResult[a,b](FSharpChoice`2 res)
   at Microsoft.FSharp.Compiler.Interactive.Shell.FsiEvaluationSession.EvalScript(String filePath)
   at Yaaf.FSharp.Scripting.Helper.evalScript@1303.Invoke(String arg00) in C:\code\FAKE\paket-files\matthid\Yaaf.FSharp.Scripting\src\source\Yaaf.FSharp.Scripting\YaafFSharpScripting.fs:line 1303
   at Yaaf.FSharp.Scripting.Helper.save_@1276-2.Invoke(Unit unitVar0) in C:\code\FAKE\paket-files\matthid\Yaaf.FSharp.Scripting\src\source\Yaaf.FSharp.Scripting\YaafFSharpScripting.fs:line 1277
   at Yaaf.FSharp.Scripting.Helper.consoleCapture[a](TextWriter out, TextWriter err, FSharpFunc`2 f) in C:\code\FAKE\paket-files\matthid\Yaaf.FSharp.Scripting\src\source\Yaaf.FSharp.Scripting\YaafFSharpScripting.fs:line 1221
   at Yaaf.FSharp.Scripting.Helper.redirectOut@1247[a](Boolean preventStdOut, OutStreamHelper out, OutStreamHelper err, FSharpFunc`2 f) in C:\code\FAKE\paket-files\matthid\Yaaf.FSharp.Scripting\src\source\Yaaf.FSharp.Scripting\YaafFSharpScripting.fs:line 1254
   at Yaaf.FSharp.Scripting.Helper.save_@1275-1.Invoke(String text) in C:\code\FAKE\paket-files\matthid\Yaaf.FSharp.Scripting\src\source\Yaaf.FSharp.Scripting\YaafFSharpScripting.fs:line 1276
   --- End of inner exception stack trace ---
   at Yaaf.FSharp.Scripting.Helper.save_@1275-1.Invoke(String text) in C:\code\FAKE\paket-files\matthid\Yaaf.FSharp.Scripting\src\source\Yaaf.FSharp.Scripting\YaafFSharpScripting.fs:line 1284
   at Yaaf.FSharp.Scripting.Helper.session@1306.Yaaf-FSharp-Scripting-IFsiSession-EvalScriptWithOutput(String ) in C:\code\FAKE\paket-files\matthid\Yaaf.FSharp.Scripting\src\source\Yaaf.FSharp.Scripting\YaafFSharpScripting.fs:line 1308
   at Fake.FSIHelper.runScriptUncached(Boolean useCache, String scriptPath, IEnumerable`1 fsiOptions, Boolean printDetails, CacheInfo cacheInfo, TextWriter out, TextWriter err) in C:\code\FAKE\src\app\FakeLib\FSIHelper.fs:line 471
System.InvalidOperationException: 'NETStandard.Library' already has a dependency defined for 'Microsoft.NETCore.Platforms'.
   at NuGet.Manifest.ValidateDependencySets(IPackageMetadata metadata)
   at NuGet.Manifest.Validate(Manifest manifest)
   at NuGet.Manifest.ReadFrom(Stream stream, IPropertyProvider propertyProvider, Boolean validateSchema)
   at NuGet.LocalPackage.ReadManifest(Stream manifestStream)
   at NuGet.ZipPackage.EnsureManifest(Func`1 manifestStreamFactory)
   at NuGet.ZipPackage..ctor(String filePath, Boolean enableCaching)
   at <StartupCode$FSI_0005>.$FSI_0005_Test$fsx.main@() in C:\Users\mynkow\Desktop\Reproduce\test.fsx:line 12
Stopped due to error

我已尝试使用所有可能依赖项的5个最新版本,结果完全相同=&gt; c#正在工作,f#不是。你有任何线索或任何你可以建议我试图解决的问题吗?

DIRTY SOLUTION:
这就是Docker.DotNet.2.124.3.nupkg的样子inside 如果我删除例如netstandard1.6一切正常。这意味着问题出在nuget.core,对吗?但为什么它在c#console app中工作?不知道!

更新:我能够正确执行F#console应用程序的代码

1 个答案:

答案 0 :(得分:1)

我已经用paket下载了包,并以这种方式更改了脚本:

#r @"./packages/FAKE/tools/FakeLib.dll"
#r @"./packages/NuGet.Core/lib/net40-Client/NuGet.Core.dll"

open System
open System.Collections.Generic
open System.IO
open Fake

Target "Test" (fun _ -> 
    printfn "=============================================================================="
    global.NuGet.ZipPackage(@"Docker.DotNet.2.124.3.nupkg").GetFiles() |> Seq.iter(fun x -> printfn "%s" x.Path )
)

RunParameterTargetOrDefault "target" "test"

它给出了这个

Microsoft (R) F# Interactive version 14.0.23413.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

For help type #help;;

> 

--> Referenced 'C:\tmp\visualfsharp.issue.nuget\./packages/FAKE/tools/FakeLib.dll'


--> Referenced 'C:\tmp\visualfsharp.issue.nuget\./packages/NuGet.Core/lib/net40-Client/NuGet.Core.dll'

Building project with version: LocalBuild
Shortened DependencyGraph for Target Test:
<== Test

The resulting target order is:
 - Test
Starting Target: Test 
==============================================================================
Running build failed.
Error:
System.InvalidOperationException: The schema version of 'Docker.DotNet' is incompatible with version 1.6.30117.9648 of NuGet. Please upgrade NuGet to the latest version from http://go.microsoft.com/fwlink/?LinkId=213942.
   at NuGet.Manifest.CheckSchemaVersion(XDocument document)
   at NuGet.Manifest.ValidateManifestSchema(XDocument document, String schemaNamespace)
   at NuGet.Manifest.ReadFrom(Stream stream, IPropertyProvider propertyProvider)
   at NuGet.ZipPackage.EnsureManifest()
   at FSI_0002.clo@9.Invoke(Unit _arg1) in C:\tmp\visualfsharp.issue.nuget\test.fsx:line 11
   at Fake.TargetHelper.runSingleTarget(TargetTemplate`1 target) in C:\code\FAKE\src\app\FakeLib\TargetHelper.fs:line 493

---------------------------------------------------------------------
Build Time Report
No target was successfully completed
---------------------------------------------------------------------
---------------------------------------------------------------------

val it : unit = ()

> 

NuGet.Core的版本是2.12,我发现它引用的是未加载的Microsoft.Web.Xdt。

也许你可以通过简单地使用paket并添加Docker.DotNet作为依赖项来实现你想要的,它会为你提取它。

如果您有可重现的错误,请填写一个zip并将问题发布到visualfsharp存储库。