2012-02-07 18 views
63

Ho un processo di compilazione automatizzato che vorrei estendere in modo da poter creare le librerie che sto distribuendo tramite NuGet. Attualmente, l'esecuzione di nuget.exe per creare i pacchetti è un'operazione manuale.Automazione della creazione del pacchetto NuGet come parte del processo di creazione

Qual è il modo migliore per configurare VS 2010 in modo che il mio pacchetto NuGet (* .nupkg) sia il risultato finale di una build di "Rilascio"?

Tenere presente che ho altri file (contenuto e strumenti) per alcuni pacchetti. E, nella maggior parte dei casi, ho riunito più progetti in un unico pacchetto NuGet per supportare .NET 4, Silveright e Phone 7.

(Devo chiarire che l'attuale processo "automatizzato" è un semplice file batch runner che costruisce una soluzione che utilizza la riga di comando.)

UPDATE

voglio aggiornare questa discussione perché la questione non è stata risolta. Sebbene il link @pravin fornito sia utile, non affronta il fatto che ho più progetti in un singolo pacchetto e altri contenuti come script PowerShell, configurazioni e trasformazioni del codice sorgente, ecc.

Il miglior esempio I può usare è un assembly che ha sia una versione .NET 4 che Silverlight 5. Questi sono distribuiti nello stesso pacchetto. Non riesco a utilizzare un evento post-build per creare il pacchetto perché il pacchetto dipende da due progetti.

+0

Hai provato: http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages – KMoraz

+5

Questo non ha nulla a che fare con la mia domanda. Quel collegamento descrive un flusso di lavoro per USARE i pacchetti di nuget. La mia domanda ha a che fare con la CREAZIONE dei pacchetti di nuget. – SonOfPirate

+1

Anche l'incremento automatico della versione nelle versioni di rilascio sarebbe bello. –

risposta

32

Una cosa che potrebbe funzionare bene è creare un file .proj MSBuild personalizzato. È possibile definire un paio di destinazioni nello script personalizzato, il primo ad eseguire la compilazione sulla propria soluzione. Un secondo obiettivo per eseguire la seguente compilazione utilizza l'attività MSBuild di EXEC per richiamare l'utilità della riga di comando nuget.exe. Quindi, aggiorni il tuo file-runner batch per eseguire l'eseguibile msbuild fornendo il tuo file di progetto personalizzato come argomento. Si potrebbe già utilizzare MSBuild nello script batch, che in tal caso sarebbe semplicemente una questione di scambio di argomenti. È possibile includere il file proj personalizzato negli elementi di soluzione della soluzione. Se lo facessi, potresti aggiungere facilmente un riferimento a strumenti esterni in Visual Studio per testare rapidamente il tuo script personalizzato per assicurarti che stia creando e producendo il pacchetto come speri.

MSBuild Esempio

È possibile utilizzare questo come un punto di partenza:

<Project DefaultTargets="Compile" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" > 
    <PropertyGroup> 
     <SolutionFile></SolutionFile> 
     <NugetExecutable>C:\PathToNuget\nuget.exe</NugetExecutable> 
     <NuspecFile></NuspecFile> 
    </PropertyGroup> 

    <Target Name = "Compile"> 
     <MSBuild Projects="$(SolutionFile)" Properties="Configuration=Release" /> 
    </Target> 

    <Target Name = "Package"> 
    <!-- You could use the MSBuild Copy task here to move the compiled code into 
      a structure that fits your desired package format --> 
     <Exec Command="&quot;$(NugetExecutable)&quot; pack $(NuspecFile)" /> 
    </Target> 
</Project> 

Farebbe quindi chiama questo tipo:

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" Build.proj /p:SolutionFile=PathToSolution\App.sln;NuspecFile=foo.nuspec 
+0

Potete fornirmi alcuni riferimenti per vedere come questo può essere fatto? – SonOfPirate

+0

Nota: il campione sopra riportato non è stato completamente testato, ma è concettualmente come si potrebbe procedere. Il riferimento MSBuild su MSDN dovrebbe aiutarti a renderlo più completo. –

+5

Si consiglia di utilizzare NuGetter. È molto più semplice da usare e configurare :) –

0

Per quanto ne so, non è possibile.

invece, farlo correttamente ed avere un ambiente di compilazione corretta/processo che spara uno script di build on impegnarsi/push al repository principale che fa il seguente:

  • Clone/pull modifiche.
  • Soluzione di costruzione.
  • Costruire pacchetto/i.
  • Carica i pacchetti sul server dei pacchetti.

È possibile eseguire TeamCity, CruiseControl.NET o qualche altro server CI su una VM o sul server di generazione esistente.

+1

È sicuramente possibile aver creato diverse librerie per il lavoro che crea un pacchetto di nuget come parte del processo di compilazione e lo invia anche al feed di nuget interno della nostra azienda come parte del processo di generazione del rilascio utilizzando gli script msbuild e lo strumento della riga di comando nuget anche se Sono felice di vedere che c'è una libreria che aiuta con questo ora ho intenzione di sperimentarlo durante la nostra prossima fase di costruzione sperimentale –

4

Installare il pacchetto Nuget Utensili nella vostra sln e aggiungerà un obiettivo di build per la creazione di nupkg, quindi modificherà l'elemento della configurazione per eseguire anche quell'attività. http://nuget.org/packages/NuGetPowerTools

+0

La versione 1.6 aggiunge un'opzione a livello di soluzione che consente di aggiungere il target di compilazione a ciascun progetto in modo da non dover impegnare i pacchetti sul controllo del codice sorgente. Mentre il file di destinazione build viene utilizzato da tutti i progetti, viene comunque eseguito come parte del processo di generazione per ogni singolo progetto. Questo non aiuta la mia situazione in cui ho bisogno di generare un singolo pacchetto contenente l'output generato da diversi progetti. – SonOfPirate

10

che sto facendo la cosa che si vuole raggiungere già nel mio progetto attuale:

Ogni montaggio è integrato nel suo proprio pacchetto NuGet, con dipendenze a posto.

L'ho risolto creando una cartella del pacchetto nel progetto per cui volevo creare un pacchetto nuget. Lì configuro un file nuspec con le informazioni necessarie sul nupkg

Lì faccio tutte le cartelle ei file immutabili necessari per la struttura del pacchetto Nuget.

ho aggiunto una fase di post accumulo nel progetto che copia i file che appena sono state costruite nella cartella del pacchetto ed eseguire nuget.exe

Così va la vita: Progetto

  • Genera.
  • Copia l'output di nuovo nel pacchetto \ Lib del progetto.
  • Eseguire nuget.exe con il file nuspec nella cartella del pacchetto.
  • Copia il risultato nella cartella di output accanto al resto dell'output.

Nuget.exe deve essere o in una cartella fisso sul sistema e la buildserver (soluzione sporca) o inclusi nella build (meno sporco).

buildscript:

Xcopy.exe /Y "$(TargetPath)" "$(ProjectDir)\Package\Lib" 
cd "$(ProjectDir)Package" 
"$(TargetDir)..\Buildscripts\Nuget.exe" pack MyPackage.nuspec xcopy /Y *.nupkg "$(TargetDir)" 

Per poter utilizzare questo, l'unica cosa che si deve prendere cura di, è decidere dove checkin il nuget.exe. Ho creato una cartella buildscripts al livello più alto del mio albero di sviluppo.

+1

Credo che tu possa copiare l'output da altri progetti anche nel passaggio di post-produzione, se sai che sono già costruiti ... – Schwarzie2478

+1

Il tuo commento è la chiave - "se sai che sono già costruiti". – SonOfPirate

+0

presumo che ci sia un certo ordine di build che viene lanciato. In caso contrario, è possibile configurare progetti vuoti che vengono sempre creati come passaggio finale – Schwarzie2478

7

Se si è in un ambiente TFS 2010, lo NuGetter project dovrebbe risolvere il problema della creazione automatica dei pacchetti di nuget. Crea un pacchetto per l'intera build. È in effetti un flusso di lavoro di generazione TFS 2010 che fa il lavoro chiamando nuget.exe con alcuni argomenti.

+0

Sebbene non sia possibile generare un pacchetto nuget per progetto con questo modello. Qualcuno l'ha mai fatto al livello TFS 2010? – Alex

+0

NuGetter dovrebbe funzionare anche per TFS 2012, ma sarà necessario aggiornare gli assembly a TFS 2012. –

+0

NuGetter è stato anche consigliato a passare da MVP di Microsoft Marcel de Vries in un video non correlato. Curioso riguardo ai suoi meriti rispetto a NuBuild. – RJB

7

Ho creato un tipo di progetto NuGet (.nuproj) estensione Visual Studio chiamata NuBuild che dovrebbe fare ciò che si desidera. Ti permette di costruire i tuoi pacchetti NuGet da Visual Studio e MSBuild. È possibile installarlo dallo gallery o ottenere la sorgente allo github.

+1

Curioso riguardo ai suoi meriti rispetto a NuGetter – RJB

1

un semplice suggerimento che potrebbe funzionare abbastanza bene ... basta mettere come evento Postbuild nel file Csproj:

<PropertyGroup> 
    <PostBuildEvent>$(SolutionDir)<YourPathToNugetHere>\NuGet.exe pack $(ProjectPath) -OutputDirectory ..\..\$(OutDir) -IncludeReferencedProjects -Symbols -Properties Configuration=$(Configuration)</PostBuildEvent> 
    </PropertyGroup> 

Questo raccoglierà la vostra abitudine .nuspec di file (che le esigenze per essere nominato come il file .csproj) e creare il .nupkg.

Questo è tutto.

Si può anche farlo semplicemente all'interno delle impostazioni di Visual Studio Project.

0

Installare il pacchetto nuget "NuGet.for.MSBuild". Non è richiesto alcun file ".nuspec" e le informazioni richieste verranno prese da AssemblyInfo.cs.

Imposta la build sulla modalità "Rilascia". Una volta costruito, il file nupkg si troverà nella cartella 'bin/Release'.

https://nuget4msbuild.codeplex.com/

Problemi correlati