8

sto cercando di migrare tutti i miei progetti C# di nuova Nuget ripristino automatico, seguendo questo tutorial: Migrating MSBuild-Integrated solutions to use Automatic Package RestoreNuget automatica per il sito web

ho fatto con successo ai miei progetti di desktop/biblioteche, che ho dovuto modificare csproj file, rimozione di queste linee da esso (non sto usando TFS):

<RestorePackages>true</RestorePackages> 
... 
<Import Project="$(SolutionDir)\.nuget\nuget.targets" /> 
... 
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> 
    <PropertyGroup> 
     <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> 
    </PropertyGroup> 
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" /> 
</Target> 

Tuttavia, siti web non sembrano avere alcuna csproj o qualsiasi altro file contenente queste istruzioni. Quando installo un pacchetto, inserisce con successo il file .dll nella cartella dei miei pacchetti, ma lo inserisce anche nella cartella bin. Se seleziono il dll sotto/bin all'interno di Esplora soluzioni, ha le seguenti proprietà:

Auto-refresh path: C:\mypackages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll 
File Name: Newtonsoft.Json.dll 
Full Path: C:\MyWebSite\Bin\Newtonsoft.Json.dll 

Questa è impostato di default quando ho installare un pacchetto da NuGet. Penso che non dovrebbe guardare nella cartella bin, o quando costruisco il progetto, dovrebbe portare la cartella .dll in bin se non esiste. Il problema è che se costruisco il progetto senza .dll in bin, mi viene restituito il seguente errore: "Impossibile trovare il tipo o il nome dello spazio dei nomi 'Newtonsoft' (ti manca una direttiva using o un riferimento all'assembly?)". Per i progetti desktop/librerie, il file .dll viene copiato nella cartella bin.

Ho letto in un'altra domanda Nuget non supporta WebSite, ma Applicazioni Web invece: NuGet Package restore for website, ma ho anche letto nella pagina di Nuget che hanno aggiunto la compatibilità ai siti Web ASP.NET, quindi ecco la mia domanda: Sono io fare qualcosa di sbagliato? O dovrei migrare all'applicazione Web perché non supporta affatto i siti Web?

+0

WAP è sicuramente la strada da percorrere. I siti web sono molto più limitati e in realtà non hanno molti vantaggi se si utilizza VS. Si noti che con il rilascio di ASP.NET 5, combinerà il meglio di entrambi i mondi. Comunque, ho usato NuGet con i siti web in passato. – mason

risposta

2

Quando si fa clic su "Abilita NuGet Pacchetto Restore" nel menu contestuale tasto destro del mouse sulla soluzione in Visual Studio si ottiene un messaggio di informazioni mostrato che dice:

Packages installed into Website projects will not be restored during build. Consider converting those into Web application projects necessary.

Tuttavia c'è una soluzione ho provato lavori. Considerare la situazione quando si dispone di un progetto di libreria di classi (DLL) a cui fa riferimento il progetto Sito Web. Se entrambi i progetti fanno riferimento allo stesso pacchetto NuGet, quindi costruendo l'intera soluzione, il progetto DLL viene creato per primo, i pacchetti vengono ripristinati correttamente. Il prossimo passo quando si tratta del progetto Sito web il pacchetto richiesto è già in atto e le sue DLL vengono copiate nella cartella /Website/Bin/ in base al file *.refresh. Risultato: la soluzione si conclude correttamente.

2

Posso confermare definitivamente che la funzione di ripristino automatico NuGet in realtà funziona per i progetti Siti Web in VS con l'ultima versione di NuGet.

Assicurarsi che:

  1. Si utilizza NuGet 2.7 o superiore (Strumenti> Estensioni e aggiornamenti> Aggiornamenti)
  2. Non v'è alcun .nuget \ NuGet.targets file alla soluzione root
  3. Hai pacchetti .config in radice del sito Web con tutti i riferimenti ai pacchetti (normalmente generate da VS quando si aggiungono pacchetti Nuget)
  4. Visual Studio è configurato per "Consentire NuGet per scaricare pacchetti mancanti" e "automaticamente verificare la presenza di pacchetti mancanti durante la costruzione "in Visual Studio (vedere Opzioni> NuGet Package Manager) - questi sono attive di default

Ecco quello che vedo come l'uscita generazione quando qualche pacchetto per sito Web progetto è mancante.

Restoring NuGet packages... 
To prevent NuGet from restoring packages during build, open the Visual Studio Options dialog, click on the Package Manager node and uncheck 'Allow NuGet to download missing packages during build.' 
------ Build started: Project: WebSite1, Configuration: Debug Any CPU ------ 
Validating Web Site 
Building directory '/'. 

Validation Complete 
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ========== 

Collegamento che descrive quanto sopra nei dettagli: https://docs.nuget.org/consume/package-restore.

+0

Vedo che il pacchetto è stato ripristinato, ma gli script non sembrano essere nuovamente aggiunti alla directory del sito web attuale. Li vedi che vengono aggiunti di nuovo? – GotDibbs

+0

@GodDibbs, quali script intendi? –

+0

Mi dispiace, ho appena realizzato che non ero abbastanza generico :). Ad esempio, se installi il [react nuget package] (https://www.nuget.org/packages/react.js/) in un progetto di sito web, rimuovi i file e la cartella dei pacchetti, quindi prova a ripristinare, la cartella dei pacchetti viene ripopolata, ma la cartella degli script nel sito Web no. – GotDibbs

2

Ho anche lo stesso problema descritto nella domanda precedente. Mi stavo chiedendo se hai capito come eseguire un ripristino di nuget sul sito web senza il file di progetto. Ho un pacchetto.config nel sito web.

Ho provato un sacco di cose diverse e il comando seguente mi ha avvicinato a una risoluzione, ma non del tutto.

NuGet ripristino packages.config -PackagesDirectory .. \ Packages

Il comando sopra fa ripristinare i pacchetti nella cartella .. \ pacchetti come previsto, ma non riesco a capire come ottenere le assemblee corretti in la cartella bin del sito web.

1

Ecco la soluzione a questo problema e funziona.

Se si dispone di un livello di business logic separato, è possibile installare i pacchetti di nuget in tale progetto. Quindi è possibile eseguire il ripristino di nuget sul livello della business logic prima di eseguire msbuild nella soluzione del sito Web. Quando si esegue msbuild sulla soluzione che contiene BLL e WebSite, tutti i gruppi di riferimento (incluse le DLL ripristinate da nuget) escono dal progetto BLL nella cartella bin del sito Web.

Questa è un'opzione di modifica se non si dispone di un livello di business logic separato. Using NuGet with *.dll.refresh files in ASP.NET "Web Site" projects with Web Deployment Projects