2016-07-05 19 views
5
Aggiornamento

: si riferisce a un insieme obsoleto di strumenti core .net costruiti attorno a project.json, questa domanda e le sue risposte sono di utilità molto limitata negli attuali strumenti di rete .net come Visual Studio 2017+.Creare un singolo progetto di origine con interi gruppi .net, PCL e dotnet core creati dalla stessa origine C#?

utilizzando Visual Studio 2015, l'aggiornamento 3, sto cercando di scoprire gli attuali limiti che esistono, che mi avrebbe impedito di fare il seguente:

  1. Per un singolo C# base di codice, compilare una .net completa versione framework e una versione PCL e una libreria di classi core .net dalle stesse origini.

  2. Solution dir solutiondir\ conterrà una directory src\ che contiene un projectdir\ (Solutiondir\src\projectdir).

  3. Projectdir conterrà un HelloWorldPCL libreria classe che è costruito come un progetto classic .net PCL, e con altri obiettivi struttura del sito.

  4. Dalla stessa Projectdir stesso HelloWorldPCL saranno anche elaborate per .net 4.6 progetto.

  5. Dalla stessa Projectdir stesso HelloWorldPCL saranno anche elaborate per .net core.

  6. Tutte le assemblee di uscita di cui sopra saranno condividere l'accesso ad un unico insieme di codice C# che possono avere alcuni #if DOTNET e #if NET46 e #if PCL definisce condizionali di gestire le cose che non sono disponibili in vari quadri/ambienti.

Finora posso fare la maggior parte di quanto sopra, ma quando cerco di avere la Projectdir contenere un .net core artefatto come project.json o HelloWorldCore.xproj, l'IDE mi dà molti errori se provo a creare distinte .csproj e .xproj progetti nella stessa cartella, in modo che non sia la strada giusta da percorrere.

Con un lavoro .csproj progetto quando introduco un .xproj e un project.json su disco, ma non abbiamo aggiunto questi per la soluzione di per sé, sono solo seduto lì sul disco accanto alle Fonti vero progetto, ottengo un pacchetto Nuget ripristinare l'errore, che può essere fatto solo per andare via eliminando il file project.json, quindi chiaramente non è possibile avere un .csproj in una directory di progetto e avere anche una cartella project.json. È necessario scegliere tra la modalità project.json (stile di progetto .net core) e la modalità .csproj (stile di progetto C# classico).

ho costruito una base di codice "spezzato" che dimostra l'impossibilità di utilizzare una cartella contenente sia un .csproj e project.json e poi cercando di costruire il progetto csproj e project.json senza interferire:

https://bitbucket.org/wpostma/helloworldcoreandpcl

Domanda: c'è QUALSIASI modo per creare un progetto da un singolo set di file sorgente C# e avere come target un assembly completo .net 4.6 e anche una libreria di classi nativa .net core e anche un PCL come sembly che potrebbe indirizzare un particolare profilo .net?

Obiezione: Si può giustamente chiedere "? Non si dovrebbe semplicemente usare un PCL e hanno fatto con esso, e dimenticare il targeting pieno .net o la creazione di un separato dll biblioteca .net core di classe". Forse se il codice potesse essere compilato una sola volta, da una singola fonte, senza alcuna definizione condizionale e senza alcuna differenza di funzionalità e se le limitazioni imposte da un PCL "netstandard n." approccio al profilo minimo fossero sufficienti, si potrebbe . Ma per quanto riguarda i casi in cui non è nemmeno possibile?

È necessario disporre di un processo di compilazione elaborato in cui è possibile copiare file di progetto o spostare il codice sorgente, al fine di ottenere il singolo file di destinazione .cs più nerdvana? O sto trascurando soluzioni alternative?

Aggiornamento: Sembra ci sia un problema con l'IDE di Visual Studio che si impedisce di aggiungere direttamente un riferimento a una libreria di classi nella soluzione, quando si genera con un project.json invece di utilizzare un .csproj. Tuttavia la soluzione qui sotto specificata da Jon indica che è necessario creare il progetto, quindi creare un pacchetto di nuget con dotnet pack. Se si guarda la mia demo modificata qui, è possibile che il file pack.cmd contenga i passaggi che ho usato per impacchettare un pacchetto nuget e quindi "pubblicarlo" localmente su un feed nuget di file (directory locale) per uso personale.

+0

Per un esempio più concreto si consideri questo codebase in cui sto cercando di creare destinazioni native della libreria di classi core .net, su un codebase che attualmente ha due soluzioni PCL e full-net che fanno due terzi di quello che volevo fare nella domanda sopra ... https://github.com/wpostma/fhir-net-api –

+2

Perché ci sono tre diversi file di progetto? Penso che tu possa fare tutto questo con un solo 'project.json' che supporta i tre diversi framework. (E puoi anche avere diverse opzioni di compilazione per i diversi framework ...) –

+0

Vedere https://stackoverflow.com/questions/36148363 per qualche aiuto con il targeting PCL da project.json –

risposta

6

Proverei ad optare per un approccio puro project.json. Ad esempio, ecco un file project.json che costruirà un singolo pacchetto che supporta netstandard1.0, profilo PCL 328 e .NET 4.6 - con ogni configurazione che definisce i propri simboli in modo da poter avere il codice condizionale.

{ 
    "version": "1.0.0", 

    "frameworks": { 
    "net46": { 
     "buildOptions": { 
     "define": [ "NET46" ] 
     } 
    }, 

    "netstandard1.0": { 
     "buildOptions": { 
     "define": [ "CORE" ] 
     }, 
     "dependencies": { 
     "NETStandard.Library": "1.6.0" 
     } 
    }, 

    ".NETPortable,Version=v4.0,Profile=Profile328": { 
     "buildOptions": { 
     "define": [ "PCL" ] 
     }, 
     "frameworkAssemblies": { 
     "mscorlib": "", 
     "System": "", 
     } 
    } 
    } 
} 

Poi basta utilizzare dotnet pack per creare il pacchetto NuGet. (Dopo aver aggiunto tutti gli altri metadati, ecc.)

+0

@WarrenP: Proverà a riprodurre. Sebbene si noti che all'interno della stessa soluzione, di solito utilizzo una dipendenza "target": "project", per evitare di dover specificare il numero di versione. –

+0

@WarrenP: Perché hai quattro progetti diversi nel tuo campione? Renderebbe più semplice capire cosa succede se ne avessi solo due: una libreria di classi con un project.json come per la mia risposta, quindi un'app console che prova a consumarlo ... (In particolare, quale progetto sta fallendo? sembra che questo possa essere un problema con i progetti csproj che non riescono a consumare progetti project.json. Dovresti provare a fare tutto project.json-based, o comprimere la libreria di classi in un pacchetto nuget, metterlo in un pacchetto sorgente locale e dipendere su quello.) –

+0

@WarrenP: Beh, vorrei controllare che il project.json risultante sia quello che vorresti che fosse. Un po 'di diligenza all'inizio può pagare i dividendi in manutenibilità in seguito. –

1

È possibile utilizzare xproj e csproj insieme a diversi file project.json. Ho fatto un post sull'argomento da verificare: http://stackify.com/using-both-xproj-and-csproj-with-net-core/

In sostanza, si crea un projectname.project.json che csproj preleva e quindi project.json che xproj utilizza. Sembra funzionare!

+0

Grazie. Questa è una tecnica utile! –

Problemi correlati