5

Ho controllato un file packages.config nel controllo del codice sorgente. Questo specifica la versione esatta della dipendenza da Nuget che voglio. Abbiamo il nostro repository NuGet. Stiamo creando questi pacchetti NuGet da soli.Come riferimento invece di copiare i file js da un pacchetto Nuget in fase di compilazione in TeamCity?

<packages> 
    <package id="Dome" version="1.0.0.19" targetFramework="net45" /> 
    <package id="Dome.Dojo" version="1.0.0.19" targetFramework="net45" /> 
</packages> 

Questi pacchetti hanno alcuni file JavaScript che quando si aggiunge il pacchetto Nuget come riferimento in Visual Studio vengono copiati la cartella Scripts nel progetto.

Non voglio controllare questi file JS a controllo del codice sorgente, voglio solo archiviare il file packages.config.

Quando il mio progetto si basa in Team City (o quando costruire in Visual Studio, dopo un checkout fresco) non copia i file JS dal pacchetto NuGet. C'è una domanda qui spiegare un problema simile:

NuGet package files not being copied to project content during build

Ma, la soluzione in risposta a questa domanda non funziona per me; quella soluzione utilizza ReInstall, che è problematica perché può aggiornare automaticamente la versione nel file packages.config (diciamo se una dipendenza è specificata come> =).

Lo scopo di tutto questo è che voglio essere in grado di eseguire il checkout di una revisione dal mio controllo sorgente e creare quella versione con le giuste dipendenze E voglio utilizzare le funzionalità di packaging di NuGet. Quindi, non voglio alcun "aggiornamento automatico all'ultima versione durante la compilazione".

C'è un problema contro NuGet (http://nuget.codeplex.com/workitem/2094) su NuGet non i file ripristino dei file di contenuto. Ed è contrassegnato come Closed By Design.

Pensando a come funziona un po 'di più, mi sembra (ma non ne sono sicuro al 100%) che per gli assembly NuGet abbia un comportamento diverso - non li copia nel progetto, invece li fa riferimento dalla posizione nella cartella dei pacchetti. Mi sembra che i file js nel pacchetto NuGet debbano essere con riferimento a, analoghi al modo in cui le DLL vengono referenziate.

C'è un modo per costruire un pacchetto NuGet in modo che faccia riferimento al JS come collegamenti nel progetto (in modo simile a come è possibile aggiungere un file esistente come collegamento in VS)? E questo risolverebbe il mio problema?

Se poi non mi prendo il consiglio dato da Jeff Handley quando si chiude spuntato Nuget Edizione 2094 sopra citato:

L'opzione che hai è quella di creare un nuovo file eseguibile console che riferimenti NuGet. Core e potresti creare un pacchetto supplementare ripristinato per uso personale che copia i contenuti del pacchetto nel progetto .

Scrivere il mio strumento da riga di comando per copiare il contenuto sembra che stia spingendo l'acqua in salita qui - sto facendo qualcosa di fondamentalmente sbagliato?

risposta

1

Il problema di fondo qui è relativamente scarso supporto di Visual Studio di progetti JavaScript e la mancanza di JavaScript del modulo incorporato caricatore.

per C#, quando si installa un pacchetto che aggiunge un riferimento nel file Csproj al montaggio su disco. Quando costruisci, MSBuild sa copiare la cosa a cui fa riferimento la directory bin. Dato che non stai controllando nella tua directory bin, tutto funziona alla grande.

Purtroppo per JavaScript, il sistema di generazione non è così maturati e non ci sono linee guida ben definite per NuGet da seguire. Idealmente (IMO), Visual Studio non eseguirà i siti Web direttamente dalla directory di origine. Invece, quando lo hai creato, copiarebbe i file JavaScript, i file CSS e HTML in una directory bin da cui sarebbero stati eseguiti. Quando esegue il debug, esegue il mapping di tali file ai file JavaScript o TypeScript originali (quindi, se apporti una modifica, non si tratta di un file temporaneo). Se ciò dovesse accadere, ora c'è un passo di costruzione ben definito e presumibilmente un tag ben definito per i file JavaScript (piuttosto che solo "contenuto"). Ciò significa che NuGet sarebbe in grado di sfruttare quel tag MSBuild ben definito e gli autori di pacchetti potrebbero sfruttare la funzionalità NuGet per fare la cosa giusta.

Sfortunatamente, nessuno dei precedenti è vero. I file JavaScript vengono eseguiti sul posto, se li hai copiati su bin su build, Visual Studio avrebbe fatto la cosa sbagliata e la modifica da un debugger avrebbe modificato i file temporanei (non gli originali). NuGet quindi non ha un posto ben definito per mettere i file in modo che lasci la decisione all'autore del pacchetto. Gli autori di pacchetti sanno che l'utente medio sta per essere eseguito direttamente dal sorgente (nessun passo di costruzione), quindi eseguono il dump dei file nella cartella di origine in cui devono essere registrati per il controllo della versione.

L'intero sistema è molto arcaico se si proviene da un ecosistema moderno come C# in cui qualcuno ha impiegato del tempo per riflettere un po 'su queste cose.

Che cosa potrebbe do è creare un'attività MSBuild che, prima della compilazione, passerebbe attraverso tutti i pacchetti, cercherà il contenuto e copierà il contenuto nella posizione desiderata. Ciò non sarebbe terribilmente difficile, anche se richiederebbe un po 'di lavoro.

Inoltre, gli autori di pacchetti possono includere un'attività di compilazione che esegue questa operazione nel loro pacchetto in modo che prima di compilare tutto il loro contenuto sia stato copiato localmente. Sfortunatamente, se solo alcuni autori di pacchetti lo fanno, si finisce con la strana frammentazione in cui alcuni pacchetti devono essere impegnati nel controllo della versione e altri no.

0

Quando un pacchetto è installato in un progetto, NuGet infatti esegue queste operazioni,

  1. Scarica il file del pacchetto dalla sorgente;
  2. Installare il pacchetto nella cosiddetta cartella dei pacchetti, che è $ (SolutionDir) \ packages per impostazione predefinita;
  3. Installare il pacchetto nel progetto, che consiste nell'aggiungere riferimenti a DLL, copiare i file contenuti nella directory del progetto ecc

Quando un pacchetto viene ripristinato, vengono eseguiti solo i primi due passi. I progetti non verranno toccati dal ripristino del pacchetto nuget. Ecco perché i file js nel tuo progetto non saranno "ripristinati".

L'unica soluzione per ora è quello di verificare nei file js nel progetto.

1

Se si è il proprietario del pacchetto, è possibile utilizzare il pacchetto nuget creato per poter avere una cartella denominata "Collegata" nel pacchetto e disporre di un semplice Install.ps1 e Uninstall.ps1 (uno liners) per aggiungere tutti i file nella cartella collegata del pacchetto nuget come esistenti al progetto.

https://github.com/baseclass/Contrib.Nuget#baseclasscontribnugetlinked

non ho provato il file come pubblicazione tratta collegate, il problema è il debug del progetto, come i file JavaScript mancheranno nelle directory.

Se si utilizza git come controllo del codice sorgente si può provare il mio pacchetto NuGet che ignora tutti i file di contenuto NuGet e li ripristina prima di costruire automaticamente.

Passo dopo passo esempio nel mio blog: http://www.baseclass.ch/blog/Lists/Beitraege/Post.aspx?ID=9&mobile=0

Problemi correlati