.NET Core multi targeting en default framework voor CLI

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
In het kort wat ik probeer te doen: een .NET Core applicatie maken die ik zowel op Linux met .NET Core kan draaien, als op Windows en Mono met het volledige framework. En hem daarnaast zowel op Linux als Windows kunnen ontwikkelen.

Dit is mij gelukt door het volgende in de csproj te zetten:

code:
1
2
3
4
5
6
7
8
9
10
11
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFrameworks>netcoreapp2.0;net46</TargetFrameworks>
    <RuntimeIdentifiers>linux-x64;win-x64</RuntimeIdentifiers>
    <AssemblyVersion>1.2.0.0</AssemblyVersion>
    <Version>1.2</Version>
  </PropertyGroup>

</Project>


Daarnaast moest ik de .NET 4.6 multi-targeting pack installeren (omdat mijn Windows 10 VM alleen .NET Core had).

Je ziet hier dat ik meerdere frameworks en runtime identifiers heb. Het idee is dus dat ik netcoreapp2.0 kan gebruiken op Linux distributies waar .NET Core ondersteund wordt. En dat ik net46 kan gebruiken op machines waar alleen Mono draait.

In mijn Windows VM werkt het sindsdien prima en kan ik zonder meer de standaard dotnet CLI commando's uitvoeren:

code:
1
2
3
dotnet run
dotnet build
dotnet publish


Zodra ik echter weer op Linux ben, dan werken deze commando's alleen als ik elke keer het framework specificeer:

code:
1
2
3
dotnet run -f netcoreapp2.0
dotnet build -f netcoreapp2.0
dotnet publish -f netcoreapp2.0


De reden hiervoor zal zijn, omdat er geen .NET 4.6 targeting pack voor Linux bestaat en hij standaard probeert het voor beide frameworks te builden etc.

Wat ik nu dus eigenlijk wil, is tegen die dotnet CLI commando's zeggen "luister, ik wil op deze machine alleen het netcoreapp2.0 framework gebruiken" en dat ik vanaf dat moment gewoon weer "dotnet run" kan doen en het by default weer werkt.

Ik heb ernaar gezocht en kon echter niets vinden.

En nu ben ik benieuwd of ik erg kippig ben of dat hier wel degelijk een oplossing voor is :X

Alvast bedankt.

PS
Ik gebruik de Windows build met .NET 4.6 dus alleen maar om het op Mono te laten draaien ;) Helaas zijn er custom Linux distributies waar ik alleen Mono heb en .NET Core het niet op doet. Door .NET 4.6 te targetten op een Windows machine kan ik het alsnog op Mono draaien.

Ask yourself if you are happy and then you cease to be.

Alle reacties


Acties:
  • 0 Henk 'm!

  • diondokter
  • Registratie: Augustus 2011
  • Laatst online: 07-10 16:17

diondokter

Dum spiro, spero

Idee: Maak je applicatie in de vorm van een .NET Standard 2.0 library met 1 entry point. Maak dan 2 application projects, 1 een .NET 4.6 console app en 1 een .NET Core console app. Reference de library in beide app projects en voer de Library.Main() uit in de Main van de app projects.

Wanneer je 4.6 moet hebben, bouw dan de 4.6 app en als je Core moet hebben, bouw dan de Core app.

Dit kan natuurlijk alleen als geen functionaliteit buiten .NET Standard 2.0 hoeft te hebben :)

[ Voor 5% gewijzigd door diondokter op 18-03-2018 20:46 ]


Acties:
  • 0 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
diondokter schreef op zondag 18 maart 2018 @ 20:45:
Idee: Maak je applicatie in de vorm van een .NET Standard 2.0 library met 1 entry point. Maak dan 2 application projects, 1 een .NET 4.6 console app en 1 een .NET Core console app. Reference de library in beide app projects en voer de Library.Main() uit in de Main van de app projects.

Wanneer je 4.6 moet hebben, bouw dan de 4.6 app en als je Core moet hebben, bouw dan de Core app.

Dit kan natuurlijk alleen als geen functionaliteit buiten .NET Standard 2.0 hoeft te hebben :)
Dit is natuurlijk wel een optie, dus dat ik een Tool.Win64 en Tool.Linux applicatie maak met een Tool.Library.

Ik hoopte alleen dat het niet nodig is ;)

Ask yourself if you are happy and then you cease to be.


Acties:
  • +2 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
Voor de mensen die het eventueel interessant vinden: ik heb dit redelijk opgelost in Visual Studio Code door mijn tasks.json aan te passen met aparte build tasks:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "command": "dotnet",
            "type": "process",
            "args": [
                "build",
                "${workspaceFolder}/keepnet.csproj"
            ],
            "problemMatcher": "$msCompile",
            "group": "build"
        },
        {
            "label": "build .NET Core",
            "command": "dotnet build -f netcoreapp2.0",
            "type": "shell",
            "problemMatcher": "$msCompile",
            "group": "build"
        },
        {
            "label": "build .NET 4.6",
            "command": "dotnet build -f net46",
            "type": "shell",
            "problemMatcher": "$msCompile",
            "group": "build"
        }
    ]
}


Als ik nu Ctrl-Shift-B doe in VS Code, dan kan ik kiezen wat ik wil builden :)

Tevens heb ik in de launch.json de preLaunchTask gezet op "build .NET Core". Hierdoor kan ik met F5 het project simpelweg op beide platformen direct uitvoeren.

[update]
Nu ik toch bezig ben ook meteen even aparte launch configurations gemaakt om mijn project met argumenten uit te voeren:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
{
   // Use IntelliSense to find out which attributes exist for C# debugging
   // Use hover for the description of the existing attributes
   // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
   "version": "0.2.0",
   "configurations": [
        {
            "name": "Launch KeepNet",
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "build .NET Core",
            // If you have changed target frameworks, make sure to update the program path.
            "program": "${workspaceFolder}/bin/Debug/netcoreapp2.0/keepnet.dll",
            "args": [],
            "cwd": "${workspaceFolder}",
            // For more information about the 'console' field, see https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md#console-terminal-window
            "console": "internalConsole",
            "stopAtEntry": false,
            "internalConsoleOptions": "openOnSessionStart"
        },
        {
            "name": "Launch KeepNet with job.xml",
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "build .NET Core",
            // If you have changed target frameworks, make sure to update the program path.
            "program": "${workspaceFolder}/bin/Debug/netcoreapp2.0/keepnet.dll",
            "args": ["-job", "job.xml"],
            "cwd": "${workspaceFolder}",
            // For more information about the 'console' field, see https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md#console-terminal-window
            "console": "internalConsole",
            "stopAtEntry": false,
            "internalConsoleOptions": "openOnSessionStart"
        },
        {
            "name": ".NET Core Attach",
            "type": "coreclr",
            "request": "attach",
            "processId": "${command:pickProcess}"
        }
    ]
}


Dat VS Code is best handig als je eenmaal uitvogelt hoe het werkt ;)

[ Voor 53% gewijzigd door Lethalis op 21-03-2018 09:29 ]

Ask yourself if you are happy and then you cease to be.