È possibile modificare la posizione dei pacchetti per NuGet?


283

Ho la seguente convenzione per la maggior parte dei miei progetti:

/src
    /Solution.sln
    /SolutionFolder
        /Project1
        /Project2
        /etc..
/lib
    /Moq
        moq.dll
        license.txt
    /Yui-Compressor
        yui.compressor.dll
/tools
    /ILMerge
        ilmerge.exe

Noterete che io non tengo le librerie esterne all'interno della cartella di origine. Sono anche molto interessato all'utilizzo di NuGet ma non voglio queste librerie esterne all'interno della cartella di origine. NuGet ha un'impostazione per cambiare la directory in cui sono caricati tutti i pacchetti?


10
Sì sì sì! Questa è esattamente la struttura del progetto che utilizzo (o quasi) e mi sono sempre chiesto con NuGet di supportarlo ...
Noldorin,

Sono andato in dettaglio su come eseguire questa operazione con la seguente risposta: stackoverflow.com/a/19466173/564726 . È spesso necessario rimuovere l'opzione solutionDir dal comando di ripristino affinché funzioni correttamente.
BrutalDev

2
Ho messo .sln allo stesso livello delle tue cartelle di livello superiore. :)
Ian Warburton,

Risposte:


242

Ora è possibile controllare in quale cartella sono installati i pacchetti.

http://nuget.codeplex.com/workitem/215

Modifica: vedi il commento di Phil Haack il 10 dicembre 2010 alle 23:45 (nell'oggetto di lavoro / il link sopra). Il supporto è parzialmente implementato in 1.0, ma non è documentato.

Secondo @dfowler: aggiungi un file nuget.config accanto alla soluzione con questo:

<settings>
<repositoryPath>{some path here}</repositoryPath>
</settings>

Esiste un pacchetto nuget per la creazione della sostituzione della cartella del pacchetto.

Aggiornamento per la versione 2.1

Come ha commentato Azat, ora esiste una documentazione ufficiale su come controllare le posizioni dei pacchetti. Le note di rilascio per 2.1 specificano la seguente configurazione in un file nuget.config (vedere le note di rilascio per una descrizione di posizioni valide in cui inserire i file di configurazione e come funziona il modello di configurazione gerarchica):

<configuration>
  <config>
    <add key="repositoryPath" value="C:\thePathToMyPackagesFolder" />
  </config>
  ... 
</configuration>

Ciò cambierebbe la cartella dei pacchetti per il livello di configurazione in cui si inserisce il file (soluzione se lo si inserisce nella directory della soluzione, progetto nella directory del progetto e così via). Si noti che le note di rilascio indicano:

[...] se hai una cartella di pacchetti esistente sotto la radice della tua soluzione, dovrai eliminarla prima che NuGet inserisca i pacchetti nella nuova posizione.


5
In realtà è possibile utilizzando il file di configurazione sopra. Il motivo per cui è stato de-enfatizzato è perché non abbiamo pensato attraverso il flusso di lavoro di abilitarlo attraverso l'interfaccia utente e altri mezzi, quindi ci aspettiamo un po 'di stranezza.
davidfowl,

5
Vedi reviewboard.nupack.com/r/131 per una descrizione completa di @dfowler di come funziona nuget.config. Ad esempio, un nuget.config valido sarebbe simile al seguente: <settings><repositoryPath>lib</repositoryPath> </settings>
Lee Harold,

5
docs.nuget.org/docs/release-notes/nuget-2.1 Vedi il paragrafo "Specifica la posizione della cartella" dei pacchetti "
Azat,

1
Posso confermare che il nuovo modo di fare le cose in 2.1+ non funziona. E ci sono bug a riguardo su codeplex: nuget.codeplex.com/workitem/2921 .
Caso

5
La seconda versione funziona per me, utilizzo l'ultima NuGet e ora due soluzioni possono condividere lo stesso repository. Penso che potrebbe non funzionare alcune persone perché potrebbero usare percorsi assoluti? Sembra che il percorso assoluto rispetto a quello relativo sia importante.
Csaba Toth,

63
  1. Creato un file chiamato "nuget.config".
  2. Aggiunto quel file nella mia cartella delle soluzioni

questo NON ha funzionato per me:

<configuration>
  <config>
    <add key="repositoryPath" value="..\ExtLibs\Packages" />
  </config>
  ... 
</configuration>

questo ha funzionato per me:

<?xml version="1.0" encoding="utf-8"?>
<settings>
  <repositoryPath>..\ExtLibs\Packages</repositoryPath>
</settings>

Anch'io. La configurazione> config non ha funzionato, ma le impostazioni> repositoryPath hanno funzionato.
Gene Reddick,

Solo la seconda soluzione funziona: docs.nuget.org/docs/reference/nuget-config-file
cheesemacfly

15
Dipende dalla versione di NuGet che si sta utilizzando.
Bronumski,

1
Nota che i percorsi relativi sono relativi alla soluzione, quindi se i tuoi progetti sono a livelli diversi, allora non funzionerà.
Nove code

2
Funziona bene con VIsual Studio 2013, ma se sto usando Visual Studio 2015, installo comunque i pacchetti nella cartella dei pacchetti vicino al file sln,
fhnaseer

40

Va bene per chiunque altro leggendo questo post - ecco cosa ho capito della miriade di risposte sopra:

  1. Il file nuget.config nella cartella .nuget è relativo a quella cartella. Questo è importante perché se la tua nuova cartella è qualcosa come '../Packages' che la metterà dove esce sempre dalla scatola. Come afferma @ bruce14, devi invece fare '../../Packages'

  2. Non sono riuscito a trovare l'ultimo nuget (2.8.5) per trovare una cartella di pacchetti al di fuori della posizione standard senza abilitare il ripristino del pacchetto. Quindi, una volta abilitato il ripristino del pacchetto, è necessario aggiungere quanto segue al file nuget.config all'interno della cartella .nuget per modificare il percorso:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      ...
      <config>
        <add key="repositoryPath" value="..\..\Packages" />
      </config>
      ...
    </configuration>
  3. (Questo è importante) Se si apportano QUALSIASI modifica alla posizione della cartella del pacchetto all'interno dei file nuget.config, è necessario riavviare Visual Studio o chiudere / ricaricare la soluzione affinché le modifiche abbiano effetto


5
Fidati di me, il tuo punto n. 3 mi ha salvato la giornata. Sono stato pazzo dalle ultime 3 ore fino a quando ho letto il tuo punto 3. : '(Grazie mille fratello!
hellodear

24

Una soluzione per Nuget 3.2 su Visual Studio 2015 è:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <config>
        <add key="repositoryPath" value="../lib" />
    </config>
</configuration>

Utilizzo della barra per la cartella principale. Salvare il file sopra (nuget.config) nella cartella della soluzione.

Il riferimento è disponibile qui


Perfetto! Funziona con Visual Studio 2015 e Nuget versione 3.2.0.10516
Anon Dev il

Sembra che tu abbia inteso una barra in avanti ... ma se la soluzione è su Windows, forse quella barra in avanti si trasforma in una barra rovesciata, o forse la barra in avanti era il refuso e dovrebbe cambiare in una barra rovesciata.
Gerard ONeill,

Sono il 2015 e ho bisogno di usare .. \ .. \ Pacchetti per farlo salire di una cartella.
Rhyous,

1
../libQuesta è una barra, non una barra all'indietro. Che vuoi dire?
jpmc26,

Sì, è esattamente una barra. Risposta aggiornata
phuongnd,

15

La soluzione proposta nelle note di rilascio per la 2.1 non funziona immediatamente. Si sono dimenticati di dire che esiste un codice:

internal string ResolveInstallPath()
{
    if (!string.IsNullOrEmpty(this.OutputDirectory))
    {
        return this.OutputDirectory;
    }
    ISettings settings = this._configSettings;

    ...
}

che gli impedisce di funzionare. Per risolvere questo problema, è necessario modificare il file NuGet.targets e rimuovere il parametro 'OutputDirectory':

    <RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)"  $(RequireConsentSwitch)</RestoreCommand>

Quindi ora, se aggiungi 'repositoryPath' config da qualche parte in NuGet.config (vedi le note di rilascio per una descrizione dei posti validi per mettere i file di configurazione), ripristinerà tutti i pacchetti in un'unica posizione, ma ... Il tuo .csproj continua contiene suggerimenti per gli assiemi scritti come percorsi relativi ...

Continuo a non capire perché siano andate male invece di cambiare PackageManager in modo da aggiungere percorsi di suggerimento relativi a PackagesDir. Questo è il modo in cui faccio manualmente per avere diverse posizioni dei pacchetti localmente (sul mio desktop) e sull'agente di compilazione.

<Reference Include="Autofac.Configuration, Version=2.6.3.862, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
  <Private>True</Private>
  <HintPath>$(PackagesDir)\Autofac.2.6.3.862\lib\NET40\Autofac.Configuration.dll</HintPath>
</Reference>

1
Hai assolutamente ragione. Nella mia azienda utilizziamo effettivamente una versione di NuGet che abbiamo modificato noi stessi che fa esattamente quello che stai descrivendo, ovvero aggiunge HintPaths relativamente alla Dir Pacchetti non relativa alla posizione del file di progetto. Funziona perfettamente. Purtroppo non siamo mai riusciti a cercare di apportare le modifiche apportate a NuGet alla versione ufficiale, ma forse è ora di farlo ora ...
Afrischke

1
@afrischke: sarebbe fantastico se tu potessi farlo. Grazie. Qualche idea su quando ciò potrebbe accadere?
sgtz

11

Oltre alla risposta di Shane Kms, se hai attivato Nuget Package Restore, modifichi NuGet.config che si trova nella cartella .nuget come segue:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <repositoryPath>..\..\ExtLibs\Packages</repositoryPath>
</configuration>

Notare il ".. \" in più, poiché fa un passo indietro dalla cartella .nuget e non dalla cartella della soluzione.


9

Nessuna di queste risposte ha funzionato per me (Nuget 2.8.6) a causa della mancanza di alcuni suggerimenti, proverò ad aggiungerli qui perché potrebbe essere utile per altri.

Dopo aver letto le seguenti fonti:
https://docs.nuget.org/consume/NuGet-Config-Settings
https://github.com/NuGet/Home/issues/1346
Sembra che

  1. Per far funzionare correttamente Install-Package con diversi repositoryPath devi usare forward slash, è perché stanno usando oggetto Uri alla posizione di analisi.
  2. Senza $ all'inizio, stava ancora ignorando le mie impostazioni.
  3. NuGet memorizza nella cache il file di configurazione, quindi dopo le modifiche è necessario ricaricare la soluzione / VS.
  4. Ho anche avuto uno strano problema durante l'utilizzo del comando NuGet.exe per impostare questa opzione, poiché ha modificato il mio NuGet.exe globale in AppData \ Roaming \ NuGet e ha iniziato a ripristinare i pacchetti lì (poiché quel file ha una priorità più alta, solo indovinando).

Per esempio

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <solution>
    <add key="disableSourceControlIntegration" value="true" />
  </solution>
  <config>
    <add key="repositorypath" value="$/../../../Common/packages" />
  </config>
</configuration>

Puoi anche usare il comando NuGet per assicurarti che la sintassi sia corretta in questo modo:

NuGet.exe config -Set repositoryPath=$/../../../Common/packages -ConfigFile NuGet.Config

8

Per i progetti .NET Core e Visual Studio 2017 sono stato in grado di ripristinare tutti i pacchetti nel percorso relativo fornendo questa configurazione:

<configuration>
  <config>
    <add key="globalPackagesFolder" value="lib" />
  </config>
  ... 
</configuration>

In base alla mia esperienza, la cartella lib è stata creata allo stesso livello in cui è stato trovato Nuget.config, indipendentemente da dove si trovasse il file sln. Ho testato e il comportamento è lo stesso per il ripristino dotnet della riga di comando e la ricostruzione di Visual Studio 2017


Ci ho provato Ho impostato la globalPackagesFolderchiave nella cartella del pacchetto del mio progetto. Ho provato ad aggiungere un singolo pacchetto con dotnet add package MyPackage. nuget.exescaricato l'intero framework di 83 pacchetti .NET in quella cartella. Non è quello che intendevo. Volevo solo il mio singolo MyPackage nella mia cartella del pacchetto locale, controllata dal codice sorgente.
Wallace Kelly,

NON FARLO! Ciò sovraccaricherà il tuo HDD abbastanza velocemente poiché i pacchetti dell'intero framework verranno scaricati ogni volta che crei una nuova app.
Alaa Masoud

1
di cui al presente risposta a un'altra domanda: stackoverflow.com/a/47407399/4572240 "respositoryPath viene utilizzato per progetti packages.config, globalPackagesFolder viene utilizzato per progetti PackageReference".
Siderite Zackwehdex,

7

Il file di configurazione nella risposta accettata funziona per me in VS2012. Tuttavia, per me funziona solo quando faccio quanto segue:

  1. Crea un nuovo progetto in VS.
  2. Esci VS - questo sembra essere importante.
  3. Copia i file di configurazione nella cartella del progetto.
  4. Riavvia VS e aggiungi i pacchetti.

Se seguo questi passaggi posso usare una cartella di pacchetti condivisa.


Il riavvio di VS è l'unico modo per farlo funzionare. Indovina il gestore dei pacchetti lo memorizza nella cache.
Filip

6

Per modificare il percorso per i progetti utilizzando PackageReference invece di pacchetti.config è necessario utilizzare globalPackagesFolder

Da https://docs.microsoft.com/en-us/nuget/reference/nuget-config-file

globalPackagesFolder (progetti che utilizzano solo PackageReference)

Il percorso della cartella dei pacchetti globali predefinita. L'impostazione predefinita è% userprofile% .nuget \ pacchetti (Windows) o ~ / .nuget / pacchetti (Mac / Linux). Un percorso relativo può essere utilizzato nei file nuget.config specifici del progetto. Questa impostazione è sovrascritta dalla variabile d'ambiente NUGET_PACKAGES, che ha la precedenza.

repositoryPath (solo pacchetti.config)

La posizione in cui installare i pacchetti NuGet invece della cartella $ (Solutiondir) / pacchetti predefinita. Un percorso relativo può essere utilizzato nei file nuget.config specifici del progetto. Questa impostazione è sovrascritta dalla variabile d'ambiente NUGET_PACKAGES, che ha la precedenza.

<config>
    <add key="globalPackagesFolder" value="c:\packageReferences" />
    <add key="repositoryPath" value="c:\packagesConfig" />
</config>

Ho messo Nuget.config vicino al mio file di soluzione e ha funzionato.


5

Un altro bocconcino che ho appena scoperto. (Potrebbe essere così semplice che alcuni non l'hanno menzionato, ma era importante per la mia soluzione.) La cartella "pacchetti" finisce nella stessa cartella del tuo file .sln.

Abbiamo spostato il nostro file .sln e quindi risolto tutti i percorsi all'interno per trovare i vari progetti e voilà! La nostra cartella dei pacchetti è finita dove volevamo.


4

AGGIORNAMENTO per VS 2017:

Sembra che le persone nel team di Nuget abbiano finalmente iniziato a usare Nuget da soli, il che li ha aiutati a trovare e risolvere diverse cose importanti. Quindi ora (se non sbaglio, dato che non sono ancora migrato a VS 2017) il seguito non è più necessario. Dovresti essere in grado di impostare "repositoryPath" su una cartella locale e funzionerà. Anche tu puoi lasciarlo affatto come per impostazione predefinita la posizione di ripristino spostata dalle cartelle della soluzione a livello di macchina. Ancora una volta, non l'ho ancora provato da solo

VS 2015 e precedenti

Solo un suggerimento per altre risposte (in particolare questo ):

La posizione della cartella del pacchetto NuGet può essere modificata tramite la configurazione, ma VisualStudio fa ancora riferimento agli assembly in questa cartella relativamente:

<HintPath>..\..\..\..\..\..\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath>

Per ovviare a questo (fino a quando una soluzione migliore) ho usato il comando subst per creare un'unità virtuale che punta a una nuova posizione della cartella Pacchetti:

subst N: C:\Development\NuGet\Packages

Ora quando si aggiunge un nuovo pacchetto NuGet, il riferimento al progetto usa la sua posizione assoluta:

<HintPath>N:\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath>

Nota:

  1. Tale unità virtuale verrà eliminata dopo il riavvio, quindi assicurati di gestirla
  2. Non dimenticare di sostituire i riferimenti esistenti nei file di progetto.

È ancora oggi? Voglio dire, non possiamo usare la posizione absoulute per i nuovi pacchetti aggiunti? questa soluzione di unità virtuale mi sembra ingombrante
batmaci,

Sì, ancora un caso in cui nulla è cambiato
Kamarey il

2
In realtà preferisco un percorso relativo - in questo modo non c'è conflitto nel controllo del codice sorgente se sviluppatori diversi hanno posizioni root diverse per il codice.
jbyrd,

Mi chiedo perché non puoi fare <HintPath>$(SolutionDir)\packages\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath> invece di usaresubst
Vinod Srivastav il

Volevo che tutti i pacchetti fossero nello stesso posto, non per soluzione
Kamarey

3

Appena aggiornato con Nuget 2.8.3. Per modificare la posizione dei pacchetti installati, ho abilitato il ripristino dei pacchetti dalla soluzione del tasto destro. Modificato NuGet.Config e aggiunto queste righe:

  <config>
    <add key="repositorypath" value="..\Core\Packages" />
  </config>

Quindi ricostruita la soluzione, ha scaricato tutti i pacchetti nella mia cartella desiderata e aggiornato automaticamente i riferimenti.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.