Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Executing c# code in f# script has unexpected behavior

I have a F# fake script which works with Nuge.Core to extract package files. If I try to do this with c# console app everything works properly. However if I execute exactly the same script in a f# fake script it is not working. There are so many dependencies here and I have no idea where to look for a help: docker.dotnet, fake, f#, nuget.core

To reproduce this you need to download Docker.DotNet.2.124.3.nupkg


For the c# sample you need console application and to install nuget.core nuget package. This is working!

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);
        }
    }
}

For the f# sample you need these two files side by side: 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 [email protected](String arg00) in C:\code\FAKE\paket-files\matthid\Yaaf.FSharp.Scripting\src\source\Yaaf.FSharp.Scripting\YaafFSharpScripting.fs:line 1303
   at [email protected](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 [email protected](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 [email protected](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

I have tried with the 5 latest versions of all possible dependencies and the results are exactly the same => c# is working, f# is not. Do you have any clue or just anything which you can advise me to try to fix this?


DIRTY SOLUTION:
This is how the Docker.DotNet.2.124.3.nupkg looks like inside
If I remove for example the netstandard1.6 everything works. This means that the problem is in nuget.core, right? But why it is working in c# console app? No idea!


UPDATE: I am able to execute properly the code from F# console application

like image 734
mynkow Avatar asked Nov 09 '22 05:11

mynkow


1 Answers

I've downloaded the packages with paket, and changed the script this way:

#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"

It gives this

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 [email protected](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 = ()

> 

The version of NuGet.Core is 2.12, and I'm seeing it is referencing Microsoft.Web.Xdt which is not loaded.

Maybe you can achieve what you want by simply using paket and adding Docker.DotNet as a dependency, it will extract it for you.

If you have reproducible error that you described, please make a zip and post an issue to visualfsharp repository.

like image 191
smoothdeveloper Avatar answered Nov 16 '22 12:11

smoothdeveloper