Sdílet prostřednictvím


Běžné konfigurace NuGetu

Chování NuGetu je řízeno kumulovanými nastaveními v jednom nebo více souborech konfigurace (XML), které mohou existovat v řešení – (projekt, pokud se nepoužívá žádné řešení), uživatelské a počítačové úrovně.

Umístění a použití konfiguračních souborů

Scope NuGet.Config umístění souboru Description
Solution Aktuální složka (také nazývaná jako složka řešení) nebo jakákoli složka až k kořenovému adresáři jednotky. Ve složce řešení platí nastavení pro všechny projekty v podsložkách. Všimněte si, že pokud je konfigurační soubor umístěný ve složce projektu, nemá na tento projekt žádný vliv. Při obnovování projektu na příkazovém řádku se adresář projektu považuje za adresář řešení, což může vést k rozdílům v chování při obnovování projektu vs.
Uživatel Windows:%appdata%\NuGet\NuGet.Config
Mac/Linux:~/.config/NuGet/NuGet.Config nebo ~/.nuget/NuGet/NuGet.Config (liší se podle nástrojů)
Na všech platformách se podporují další konfigurace. Tyto konfigurace nelze upravit pomocí nástrojů.
Windows:%appdata%\NuGet\config\*.Config
Mac/Linux:~/.config/NuGet/config/*.config nebo ~/.nuget/config/*.config
Nastavení platí pro všechny operace, ale jsou přepsána jakýmikoli nastaveními na úrovni řešení.
Computer Windows:%ProgramFiles(x86)%\NuGet\Config
Mac/Linux:/etc/opt/NuGet/Config (Linux) nebo /Library/Application Support (Mac) ve výchozím nastavení. Pokud $NUGET_COMMON_APPLICATION_DATA není null ani prázdný, pak $NUGET_COMMON_APPLICATION_DATA/NuGet/Config místo toho
Nastavení platí pro všechny operace na počítači, ale jsou přepsána nastaveními na úrovni uživatele nebo řešení systému.

Poznámka:

V systému Mac/Linux se umístění konfiguračního souboru uživatele liší podle nástrojů. .NET CLI používá ~/.nuget/NuGet složku, zatímco Mono používá ~/.config/NuGet složku.

V systému Mac/Linux se umístění konfiguračního souboru na úrovni uživatele liší podle nástrojů.

V systému Mac/Linux se umístění konfiguračního souboru uživatele liší podle nástrojů. Většina uživatelů používá nástroje, které hledají konfigurační soubor uživatele ve ~/.nuget/NuGet složce. Tyto další nástroje vyhledá konfigurační soubor uživatele ve ~/.config/NuGet složce:

  • Mono
  • NuGet.exe
  • Visual Studio 2019 pro Mac (a starší verze)
  • Visual Studio 2022 pro Mac (a novější verze) pouze při práci na klasických projektech Mono.

Pokud nástroje, které používáte, zahrnují obě umístění, zvažte jejich sloučení pomocí následujících kroků, abyste mohli pracovat pouze s jedním konfiguračním souborem na úrovni uživatele:

  1. Zkontrolujte obsah dvou konfiguračních souborů na úrovni uživatele a ponechte ten, který chcete mít ve ~/.nuget/NuGet složce.
  2. Nastavit symbolický odkaz z ~/.nuget/NuGet na ~/.config/NuGet. Například spustit příkaz bash: ln -s ~/.nuget/NuGet ~/.config/NuGet.

Poznámky ke starším verzím NuGetu:

  • NuGet 3.3 a starší používal .nuget složku pro nastavení celého řešení. Tato složka se v NuGetu 3.4+nepoužívá.
  • Pro NuGet 2.6 až 3.x byl konfigurační soubor na úrovni počítače ve Windows umístěn v %ProgramData%\NuGet\Config[\{IDE}[\{Version}[\{SKU}]]]\NuGet.Config, kde {IDE} může být VisualStudio, {Version} byl verzí sady Visual Studio, například 14.0, a {SKU} je buď Community, Pronebo Enterprise. Pokud chcete migrovat nastavení na NuGet 4.0+, jednoduše zkopírujte konfigurační soubor do %ProgramFiles(x86)%\NuGet\Configsouboru . Na Linuxu bylo toto předchozí umístění /etc/opt, a na Macu /Library/Application Support.

Změna nastavení konfigurace

Soubor NuGet.Config je jednoduchý textový soubor XML obsahující páry klíč/hodnota, jak je popsáno v tématu Nastavení konfigurace NuGet .

Nastavení se spravují pomocí konfiguračního příkazu Rozhraní příkazového řádku NuGet:

  • Ve výchozím nastavení se změny v konfiguračním souboru na úrovni uživatele provádějí. (V systému Mac/Linux se umístění konfiguračního souboru na úrovni uživatele liší podle nástrojů)
  • Pokud chcete změnit nastavení v jiném souboru, použijte -configFile přepínač. V takovém případě mohou soubory používat libovolný název souboru.
  • Klíče jsou vždy citlivé na velikost písmen.
  • Pro změnu nastavení v souboru nastavení na úrovni počítače je vyžadováno zvýšení úrovně oprávnění.

Výstraha

I když můžete soubor upravit v libovolném textovém editoru, NuGet (v3.4.3 a novější) bezobslužně ignoruje celý konfigurační soubor, pokud obsahuje poškozený kód XML (neshodované značky, neplatné uvozovky atd.). Proto je vhodnější spravovat nastavení pomocí nuget config.

Nastavení hodnoty

Windows:

# Set globalPackagesFolder in the user-level config file
dotnet nuget config set globalPackagesFolder "C:\packages"

# Set repositoryPath (available for packages.config only) in the user-level config file
dotnet nuget config set repositoryPath "C:\packages"

# Set repositoryPath in solution-level files
dotnet nuget config set repositoryPath "C:\packages" --configfile "C:\my.config"
dotnet nuget config set repositoryPath "c:\packages" --configfile "..\..\my.config"

# Set repositoryPath in the computer-level file (requires elevation)
dotnet nuget config set repositoryPath "c:\packages" --configfile "%appdata%\NuGet\NuGet.Config"

Mac/Linux:

# Set globalPackagesFolder in the user-level config file
dotnet nuget config set globalPackagesFolder /home/packages

# Set repositoryPath (available for packages.config only) in the user-level config file
dotnet nuget config set repositoryPath /home/packages

# Set repositoryPath in solution-level files
dotnet nuget config set repositoryPath /home/projects/packages --configfile /home/my.Config
dotnet nuget config set repositoryPath /home/packages --configfile home/myApp/NuGet.Config

# Set repositoryPath in the computer-level file (requires elevation)
dotnet nuget config set repositoryPath /home/packages --configfile $XDG_DATA_HOME/NuGet.Config

Poznámka:

V NuGetu 3.4 a novějším můžete použít proměnné prostředí v libovolné hodnotě, například v repositoryPath=%PACKAGEHOME% (Windows) a repositoryPath=$PACKAGEHOME (Mac/Linux).

Odebrání hodnoty

Pokud chcete odebrat hodnotu, zadejte klíč s prázdnou hodnotou.

# Windows
nuget config -set repositoryPath= -configfile c:\my.Config

# Mac/Linux
nuget config -set repositoryPath= -configfile /home/my.Config

Vytvoření nového konfiguračního souboru

Pomocí rozhraní příkazového řádku .NET vytvořte výchozí nuget.config spuštěním dotnet new nugetconfigpříkazu . Další informace najdete v tématu příkazy rozhraní příkazového řádku dotnet.

Případně ručně zkopírujte následující šablonu do nového souboru a pak použijte nuget config -configFile <filename> k nastavení hodnot:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
</configuration>

Jak se použijí nastavení

Několik NuGet.Config souborů umožňuje ukládat nastavení do různých umístění, aby se použilo pro jedno řešení nebo skupinu řešení. Tato nastavení se souhrnně vztahují na jakoukoli operaci NuGet vyvolanou z příkazového řádku nebo z Visual Studio, s nastavením, které jsou "nejblíže" řešení nebo aktuální složce, která mají přednost. Pokud se nástroj příkazového řádku používá v souboru projektu místo souboru řešení, použije se adresář projektu jako "adresář řešení", což může vést k nekonzistentnímu chování, pokud je NuGet.Config soubor v podadresáři souboru řešení.

Konkrétně platí, že pokud není konfigurační soubor explicitně zadán na příkazovém řádku, NuGet načte nastavení z různých konfiguračních souborů v následujícím pořadí:

  1. (Méně časté) SouborNuGetDefaults.Config, který obsahuje nastavení související pouze se zdroji balíčků.
  2. Soubor na úrovni počítače.
  3. Soubor na úrovni uživatele.
  4. Soubory nalezené v každé složce v cestě od kořenového adresáře jednotky k aktuální složce (kde je nuget.exe vyvoláno nebo ve složce obsahující řešení sady Visual Studio). Pokud je například vyvolán c:\A\B\C příkaz, NuGet hledá a načte konfigurační soubory v c:\, pak c:\A, pak c:\A\B, a nakonec c:\A\B\C.

Pokud je konfigurační soubor explicitně zadán na příkazovém řádku, nebo nuget -configFile my.configdotnet restore --configfile my.configse použijí pouze nastavení ze zadaného souboru.

Když NuGet najde nastavení v těchto souborech, použijí se takto:

  1. U elementů s jednou položkou nuGet nahradil všechny dříve nalezené hodnoty stejného klíče. To znamená, že nastavení, která jsou k aktuální složce nebo řešení nejblíže, přepíší všechny ostatní nalezené dříve. Například nastavení defaultPushSource je přepsáno NuGetDefaults.Config pokud existuje v jiném konfiguračním souboru.
  2. Pro prvky kolekce (například <packageSources>) NuGet kombinuje hodnoty ze všech konfiguračních souborů do jedné kolekce.
  3. Pokud <clear /> je pro daný uzel přítomen, NuGet ignoruje dříve definované hodnoty konfigurace pro daný uzel.

Návod

nuget.config Přidejte soubor do kořenového adresáře úložiště řešení. To je považováno za osvědčený postup, protože podporuje opakovatelnost a zajišťuje, že různí uživatelé mají stejnou konfiguraci NuGet.

Návod k nastavení

Řekněme, že máte následující strukturu složek na dvou samostatných jednotkách:

disk_drive_1
    User
disk_drive_2
    Project1
        Source
    Project2
        Source
    tmp

Pak máte čtyři NuGet.Config soubory v následujících umístěních s daným obsahem. (Soubor na úrovni počítače není v tomto příkladu zahrnutý, ale chová se podobně jako soubor na úrovni uživatele.)

File A. User-level file, (%appdata%\NuGet\NuGet.Config on Windows, ~/.config/NuGet/NuGet.Config on Mac/Linux):

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="nuget" value="https://api.nuget.org/v3/index.json" />
  </packageSources>
</configuration>

Soubor B: disk_drive_2/NuGet.Config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <config>
        <add key="repositoryPath" value="disk_drive_2/tmp" />
    </config>
    <packageRestore>
        <add key="enabled" value="True" />
    </packageRestore>
</configuration>

Soubor C. disk_drive_2/Project1/NuGet.Config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <config>
        <add key="repositoryPath" value="External/Packages" />
        <add key="defaultPushSource" value="https://MyPrivateRepo/ES/api/v2/package" />
    </config>
    <packageSources>
        <clear /> <!-- ensure only the sources defined below are used -->
        <add key="MyPrivateRepo - ES" value="https://MyPrivateRepo/ES/nuget" />
    </packageSources>
</configuration>

Soubor D. disk_drive_2/Project2/NuGet.Config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <packageSources>
        <!-- Add this repository to the list of available repositories -->
        <add key="MyPrivateRepo - DQ" value="https://MyPrivateRepo/DQ/nuget" />
    </packageSources>
</configuration>

NuGet pak načte a použije nastavení následujícím způsobem v závislosti na tom, kde se vyvolá:

  • Vyvoláno z disk_drive_1/users: Používá se pouze výchozí úložiště uvedené v konfiguračním souboru na úrovni uživatele (A), protože se jedná o jediný soubor, na disk_drive_1který se nachází .

  • Vyvoláno z disk_drive_2/ nebo disk_drive_/tmp: Soubor na úrovni uživatele (A) se nejprve načte, pak NuGet přejde do kořenového disk_drive_2 adresáře a najde soubor (B). NuGet také hledá konfigurační soubor, /tmp ale nenajde ho. Výsledkem je, že se použije výchozí úložiště nuget.org, povolí se obnovení balíčků a balíčky se rozbalí v disk_drive_2/tmp.

  • Vyvoláno z disk_drive_2/Project1 nebo disk_drive_2/Project1/Source: Soubor na úrovni uživatele (A) se nejprve načte, pak NuGet načte soubor (B) z kořenového disk_drive_2adresáře a potom soubor (C). Nastavení v (C) mají přednost před těmi v (B) a (A), takže cesta, kam se balíčky nainstalují, je disk_drive_2/Project1/External/Packages místo disk_drive_2/tmp. Také proto, že (C) vymaže <packageSources>, není nuget.org k dispozici jako zdroj, zbývá pouze https://MyPrivateRepo/ES/nuget.

  • Vyvoláno z disk_drive_2/Project2 nebo disk_drive_2/Project2/Source: Soubor na úrovni uživatele (A) se nejprve načte za souborem (B) a souborem (D). Vzhledem k tomu, že packageSources není vymazáno, jsou obě nuget.org a https://MyPrivateRepo/DQ/nuget k dispozici jako zdroje. Balíčky se rozbalí disk_drive_2/tmp , jak je uvedeno v (B).

Další uživatelská konfigurace

Od verze 5.7 přidal NuGet podporu dalších konfiguračních souborů pro celé uživatele. To umožňuje dodavatelům třetích stran přidávat další konfigurační soubory uživatelů bez zvýšení oprávnění. Tyto konfigurační soubory se nacházejí ve standardní konfigurační složce uživatele v podsložce config. Všechny soubory končící .config nebo .Config budou brány v úvahu. Tyto soubory nelze upravovat standardními nástroji.

Platforma operačního systému Další konfigurace
Windows %appdata%\NuGet\config\*.Config
Mac/Linux ~/.config/NuGet/config/*.config nebo ~/.nuget/config/*.config

Výchozí soubor NuGet

NuGetDefaults.Config je neobvyklý a může jen určit zdroje balíčků, ze kterých se balíčky instalují a aktualizují, nebo nastavit výchozí cíl pro publikování balíčků s nuget push.

Vzhledem k tomu, že správci můžou pohodlně (pomocí zásad skupiny) nasazovat konzistentní NuGetDefaults.Config soubory pro vývojáře a sestavování počítačů, můžou zajistit, aby všichni uživatelé v organizaci používali konzistentní zdroje balíčků bez ohledu na to, jestli to zahrnuje nuget.org.

Důležité

Soubor NuGetDefaults.Config nikdy nezpůsobí odebrání zdroje balíčku z konfigurace NuGet vývojáře. To znamená, že pokud už vývojář použil NuGet, a proto má zaregistrovaný zdroj balíčku nuget.org, po vytvoření NuGetDefaults.Config souboru se neodebere.

Kromě toho ani NuGetDefaults.Config žádný jiný mechanismus v NuGetu nemůže zabránit přístupu ke zdrojům balíčků, jako je nuget.org. Pokud chce organizace takový přístup blokovat, musí k tomu použít jiné prostředky, jako jsou brány firewall.

NuGetDefaults.Config umístění

Následující tabulka popisuje, kam NuGetDefaults.Config se má soubor uložit v závislosti na cílovém operačním systému:

Platforma operačního systému NuGetDefaults.Config Umístění
Windows Visual Studio 2017 nebo NuGet 4.x+:%ProgramFiles(x86)%\NuGet
Visual Studio 2015 a starší nebo NuGet 3.x a starší:%PROGRAMDATA%\NuGet
Mac/Linux $XDG_DATA_HOME (obvykle ~/.local/share nebo /usr/local/sharev závislosti na distribuci operačního systému)

Nastavení NuGetDefaults.Config

  • packageSources: Tato kolekce má stejný význam jako packageSources v běžných konfiguračních souborech a určuje výchozí zdroje. NuGet používá zdroje v pořadí při instalaci nebo aktualizaci balíčků v projektech pomocí packages.config formátu správy. Pro projekty používající formát PackageReference používá NuGet nejprve místní zdroje, pak zdroje v síťových sdílených složkách, pak zdroje HTTP bez ohledu na pořadí v konfiguračních souborech. NuGet vždy ignoruje pořadí zdrojů při operacích obnovy.

  • disabledPackageSources: Tato kolekce má stejný význam jako v NuGet.Config souborech, kde je každý ovlivněný zdroj uveden podle názvu a true/false hodnota označující, jestli je zakázaný. To umožňuje, aby název zdroje a adresa URL zůstaly ve packageSources bez toho, že by byly výchozím nastavením zapnuty. Jednotliví vývojáři pak můžou zdroj znovu povolit tak, že nastaví hodnotu zdroje do false jiných NuGet.Config souborů, aniž by museli znovu najít správnou adresu URL. To je také užitečné, když vývojářům poskytnete úplný seznam interních zdrojových adres URL pro organizaci a ve výchozím nastavení povolíte jenom zdroj jednotlivých týmů.

  • defaultPushSource: určuje výchozí cíl pro nuget push operace, přepisující vestavěné výchozí nastavení nuget.org. Správci mohou nasadit toto nastavení, aby se zabránilo náhodnému publikování interních balíčků na veřejnost nuget.org, protože vývojáři musí použít nuget push -Source k publikování na nuget.org.

Příklad NuGetDefaults.Config a aplikace

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- defaultPushSource key works like the 'defaultPushSource' key of NuGet.Config files. -->
    <!-- This can be used by administrators to prevent accidental publishing of packages to nuget.org. -->
    <config>
        <add key="defaultPushSource" value="https://contoso.com/packages/" />
    </config>

    <!-- Default Package Sources; works like the 'packageSources' section of NuGet.Config files. -->
    <!-- This collection cannot be deleted or modified but can be disabled/enabled by users. -->
    <packageSources>
        <add key="Contoso Package Source" value="https://contoso.com/packages/" />
        <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
    </packageSources>

    <!-- Default Package Sources that are disabled by default. -->
    <!-- Works like the 'disabledPackageSources' section of NuGet.Config files. -->
    <!-- Sources cannot be modified or deleted either but can be enabled/disabled by users. -->
    <disabledPackageSources>
        <add key="nuget.org" value="true" />
    </disabledPackageSources>
</configuration>