2016-06-07 34 views
8

Sto utilizzando il Nuget Package Explorer per creare alcuni pacchetti di nuget. Sono riuscito a farlo solo costruendo un progetto in modalità Release in VS e aggiungendo entrambi i file dll e pdb al pacchetto.Come creare un pacchetto nuget con sia dll di debug che di debug usando nuget package explorer?

Finora tutto bene, ma quando aggiungo il pacchetto a un altro progetto e provo ad entrare nel codice durante il debug, lo scavalcherò invece.

Capisco che ho bisogno di compilare e aggiungere Debug dll e pdb al mio pacchetto se voglio entrare nel codice durante il debug. Non sono sicuro però di come aggiungere questi al pacchetto che ho già creato, che contiene già il dll di rilascio e il file pdb, che hanno lo stesso nome.

Qualche idea?

risposta

5

I miei pensieri sono, la confezione NuGet è un sacco di convenzioni.

Non c'è nessun problema nel confezionamento stessi spazi dei nomi e stessi nomi per diverse piattaforme (come in lib/net40/mydll.dll, lib/net35/mydll.dll ecc nello stesso package), come NuGet filtrerà le dipendenze registrati dalla piattaforma.

La creazione di più versioni per la stessa piattaforma sembra non convenzionale, this discussion è sbilanciato verso la realizzazione di un pacchetto per generazione. Ciò non significa che non puoi farlo, ma prima dovresti chiederti se dovresti.

Detto questo, se le versioni di debug e release sono molto diverse (compilazione condizionale, ecc.), Ciò potrebbe comunque essere utile. Ma in che modo gli utenti finali sceglieranno Release o Debug durante l'installazione del pacchetto?

Un'idea potrebbe essere, una versione per configurazione di build. Both can be installed into the project. Per fare ciò, aggiungi uno targets file to your package o crea a powershell install script che aggiunge riferimenti condizionali direttamente nel file di progetto di destinazione, se vuoi qualcosa di meno semplice di quello che MsBuild può fare per te.

Esempio del primo tattica: Creare un file .target (nel pacchetto, creare una cartella build e quindi creare build\YourLib.targets con i seguenti contenuti):

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
<ItemGroup Condition="'$(Configuration)' == 'Debug'"> 
    <Reference Include="YourLib"> 
     <HintPath>..\packages\YourLib.1.0.0\lib\Debug\YourLib.dll</HintPath> 
    </Reference> 
    </ItemGroup> 

    <ItemGroup Condition="'$(Configuration)' == 'Release'"> 
    <Reference Include="YourLib"> 
     <HintPath>..\packages\YourLib.1.0.0\lib\Release\YourLib.dll</HintPath> 
    </Reference> 
    </ItemGroup> 
</Project> 

Fornendo si è creato il debug e rilasciare le cartelle (piattaforma la cartella è facoltativa), l'output della build cambierà in base alla configurazione, a patto che gli utenti del pacchetto abbiano nomi di configurazione convenzionali, ma si potrebbe sempre estendere la logica della condizione con $(Configuration).Contains etc o semplicemente inserirla nel pacchetto readme

3

Ispirato a @Tewr Ho trovato una soluzione ingombrante ma funzionante.

Creare un NuGet con la seguente struttura di file:

lib\net\$(Configuration)\YourLib.1.0.0.dll <---- put here some dummy file named YourLib.1.0.0.dll 
tools\release\YourLib.1.0.0.dll <--- put here the release version 
tools\debug\YourLib.1.0.0.dll <--- put here the debug version 
build\YourLib.targets 

Il contenuto del file target:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
<Target Name="CopyReferences" BeforeTargets="Build" Condition="Exists('..\packages\YourLib.1.0.0\lib\net\%24(Configuration)')">  
    <Exec Command="mkdir ..\packages\YourLib.1.0.0\lib\net\Release" /> 
    <Exec Command="mkdir ..\packages\YourLib.1.0.0\lib\net\Debug" /> 
    <Exec Command='copy "..\packages\YourLib.1.0.0\tools\Release\YourLib.1.0.0.dll" "..\packages\YourLib.1.0.0\lib\net\Release"' /> 
    <Exec Command='copy "..\packages\YourLib.1.0.0\tools\Debug\YourLib.1.0.0.dll" "..\packages\YourLib.1.0.0\lib\net\Debug"' /> 
    <Exec Command='rmdir /S /Q "..\packages\YourLib.1.0.0\lib\net\%24(Configuration)"' /> 
</Target> 

le DLL in lib cartella verrà automaticamente aggiunto come riferimenti la creazione di il seguente nel file di progetto:

<Reference Include="YourLib> 
    <HintPath>..\packages\YourLib.1.0.0\lib\net\$(Configuration)\YourLib.1.0.0.dll</HintPath> 
    <Private>True</Private> 
</Reference> 

Una volta che si genera il progetto per la prima volta, l'obiettivo copierà il rilascio e la versione di debug da strumenti \ rilasciare e strumenti \ debug cartelle lib \ net \ release e lib \ net \ debug cartelle. Alla fine, cancellerà la cartella lib \ net \ $ (Configurazione)

Divertiti (o meno - Personalmente non mi piace la soluzione).

+1

Questa risposta dovrebbe essere preoccupata. Grazie. –