Moduly plug-in NuGet pro různé platformy
V nuGetu 4.8+ byla přidána podpora modulů plug-in pro různé platformy. Toho bylo dosaženo vytvořením nového modelu rozšiřitelnosti modulů plug-in, který musí odpovídat striktní sadě pravidel provozu. Moduly plug-in jsou samostatné spustitelné soubory (spustitelné ve světě .NET Core), které klienti NuGet spouští v samostatném procesu. Jedná se o skutečný zápis jednou, spusťte všude plugin. Bude fungovat se všemi klientskými nástroji NuGet. Moduly plug-in můžou být .NET Framework (NuGet.exe, MSBuild.exe a Visual Studio) nebo .NET Core (dotnet.exe). Je definován protokol komunikace se verzí mezi klientem NuGet a modulem plug-in. Během spouštění metody handshake vyjednávají verze protokolu 2.
Aby bylo možné pokrýt všechny scénáře klientských nástrojů NuGet, potřebovali byste rozhraní .NET Framework i modul plug-in .NET Core. Níže jsou popsány kombinace modulů plug-in klienta/architektury.
Klientský nástroj | Framework |
---|---|
Visual Studio | .NET Framework |
dotnet.exe | .NET Core |
NuGet.exe | .NET Framework |
MSBuild.exe | .NET Framework |
NuGet.exe na Mono | .NET Framework |
Jak to funguje
Pracovní postup vysoké úrovně lze popsat takto:
- NuGet zjišťuje dostupné moduly plug-in.
- Pokud je to možné, NuGet iteruje moduly plug-in v pořadí priority a spustí je po jednom.
- NuGet použije první modul plug-in, který může žádost obsluhovat.
- Moduly plug-in budou vypnuté, když už nejsou potřeba.
Obecné požadavky na modul plug-in
Aktuální verze protokolu je 2.0.0. V této verzi jsou požadavky následující:
- Mají platná důvěryhodná sestavení podpisů Authenticode, která budou spuštěna ve Windows a Mono. Pro sestavení spuštěná v Linuxu a Macu ještě neexistuje žádný zvláštní požadavek na vztah důvěryhodnosti. Relevantní problém
- Podpora bezstavového spouštění v aktuálním kontextu zabezpečení klientských nástrojů NuGet Například klientské nástroje NuGet nebudou provádět zvýšení oprávnění ani další inicializaci mimo protokol modulu plug-in popsaný později.
- Buďte neinteraktivní, pokud není explicitně zadáno.
- Dodržujte verzi protokolu vyjednaných modulů plug-in.
- Zareagujte na všechny žádosti v přiměřeném časovém období.
- Respektujte žádosti o zrušení pro všechny probíhající operace.
Technická specifikace je podrobněji popsána v následujících specifikacích:
Klient – Interakce modulu plug-in
Klientské nástroje NuGet a moduly plug-in komunikují s JSON přes standardní streamy (stdin, stdout, stderr). Všechna data musí mít kódování UTF-8. Moduly plug-in se spustí s argumentem -Plugin. V případě, že uživatel přímo spustí spustitelný soubor plug-in bez tohoto argumentu, může modul plug-in poskytnout informativní zprávu místo čekání na handshake protokolu. Časový limit handshake protokolu je 5 sekund. Modul plug-in by měl dokončit nastavení co nejkratším způsobem. Klientské nástroje NuGet se dotazují na podporované operace modulu plug-in předáním indexu služby pro zdroj NuGet. Modul plug-in může použít index služby ke kontrole přítomnosti podporovaných typů služeb.
Komunikace mezi klientskými nástroji NuGet a modulem plug-in je obousměrná. Každý požadavek má časový limit 5 sekund. Pokud by operace měly trvat déle, měl by příslušný proces odeslat zprávu o průběhu, aby se zabránilo časového limitu požadavku. Po 1 minutě nečinnosti se modul plug-in považuje za nečinný a vypne se.
Instalace a zjišťování modulů plug-in
Moduly plug-in budou zjištěny prostřednictvím konvence založené na adresářové struktuře.
Scénáře CI/CD a výkonní uživatelé můžou k přepsání chování použít proměnné prostředí. Při použití proměnných prostředí jsou povoleny pouze absolutní cesty. Mějte na paměti, že NUGET_NETFX_PLUGIN_PATHS
a NUGET_NETCORE_PLUGIN_PATHS
jsou k dispozici pouze s verzí 5.3 nebo novějšími nástroji NuGet.
NUGET_NETFX_PLUGIN_PATHS
– definuje moduly plug-in, které budou použity nástroji založenými na rozhraní .NET Framework (NuGet.exe/MSBuild.exe/Visual Studio). Má přednost předNUGET_PLUGIN_PATHS
. (Pouze NuGet verze 5.3 nebo novější)NUGET_NETCORE_PLUGIN_PATHS
– definuje moduly plug-in, které budou použity nástroji založenými na .NET Core (dotnet.exe). Má přednost předNUGET_PLUGIN_PATHS
. (Pouze NuGet verze 5.3 nebo novější)NUGET_PLUGIN_PATHS
– definuje moduly plug-in, které se použijí pro daný proces NuGet, priorita se zachová. Pokud je tato proměnná prostředí nastavená, přepíše zjišťování na základě konvence. Ignorováno, pokud je zadána kterákoliv z proměnných specifických pro architekturu.- User-location, the NuGet Home location in
%UserProfile%/.nuget/plugins
. Toto umístění nelze přepsat. Pro moduly plug-in .NET Core a .NET Framework se použije jiný kořenový adresář.
Framework | Umístění kořenového zjišťování |
---|---|
.NET Core | %UserProfile%/.nuget/plugins/netcore |
.NET Framework | %UserProfile%/.nuget/plugins/netfx |
Každý modul plug-in by měl být nainstalovaný ve své vlastní složce. Vstupním bodem modulu plug-in bude název nainstalované složky s rozšířeními .dll pro .NET Core a .exe rozšíření pro rozhraní .NET Framework.
.nuget
plugins
netfx
myPlugin
myPlugin.exe
nuget.protocol.dll
...
netcore
myPlugin
myPlugin.dll
nuget.protocol.dll
...
Poznámka:
V současné době neexistuje žádný uživatelský příběh pro instalaci modulů plug-in. Přesunutí požadovaných souborů do předem určeného umístění je jednoduché.
Podporované operace
V rámci nového protokolu modulu plug-in se podporují dvě operace.
Název operace | Minimální verze protokolu | Minimální verze klienta NuGet |
---|---|---|
Stáhnout balíček | 1.0.0 | 4.3.0 |
Authentication | 2.0.0 | 4.8.0 |
Spouštění modulů plug-in ve správném modulu runtime
Pro NuGet ve dotnet.exe scénářích musí být moduly plug-in schopné spouštět v rámci tohoto konkrétního modulu runtime dotnet.exe. Je na poskytovateli modulu plug-in a spotřebiteli, aby se zajistilo, že se používá kompatibilní kombinace dotnet.exe/pluginu. Potenciální problém může nastat s moduly plug-in umístění uživatele, když se například dotnet.exe pod modulem runtime 2.0 pokusí použít modul plug-in napsaný pro modul runtime 2.1.
Ukládání funkcí do mezipaměti
Ověření zabezpečení a vytvoření instance modulů plug-in je nákladné. Operace stahování se provádí častěji než ověřovací operace, ale průměrný uživatel NuGet má pravděpodobně pouze ověřovací modul plug-in. Aby se prostředí zlepšilo, NuGet uloží deklarace operací pro danou žádost do mezipaměti. Tato mezipaměť je pro každý modul plug-in s klíčem modulu plug-in cestou a vypršení platnosti této mezipaměti schopností je 30 dnů.
Mezipaměť je umístěna a %LocalAppData%/NuGet/plugins-cache
přepsána proměnnou NUGET_PLUGINS_CACHE_PATH
prostředí .
Pokud chcete tuto mezipaměť vymazat, můžete spustit příkaz locals s plugins-cache
možností.
Možnost all
locals teď také odstraní mezipaměť modulů plug-in.
Index zpráv protokolu
Zprávy protokolu verze 1.0.0 :
Zavřít
- Směr žádosti: NuGet – modul plug-in>
- Požadavek nebude obsahovat žádnou datovou část.
- Neočekává se žádná odpověď. Správná odpověď je, aby se proces plug-inu okamžitě ukončil.
Kopírování souborů v balíčku
- Směr žádosti: NuGet – modul plug-in>
- Požadavek bude obsahovat:
- ID a verze balíčku
- umístění zdrojového úložiště balíčku
- cílová cesta k adresáři
- výčet souborů v balíčku, které se mají zkopírovat do cesty k cílovému adresáři
- Odpověď bude obsahovat:
- kód odpovědi označující výsledek operace
- Výčet úplných cest pro zkopírované soubory v cílovém adresáři, pokud byla operace úspěšná
Kopírování souboru balíčku (.nupkg)
- Směr žádosti: NuGet – modul plug-in>
- Požadavek bude obsahovat:
- ID a verze balíčku
- umístění zdrojového úložiště balíčku
- cesta k cílovému souboru
- Odpověď bude obsahovat:
- kód odpovědi označující výsledek operace
Získání přihlašovacích údajů
- Směr žádosti: modul plug-in –> NuGet
- Požadavek bude obsahovat:
- umístění zdrojového úložiště balíčku
- stavový kód HTTP získaný ze zdrojového úložiště balíčku pomocí aktuálních přihlašovacích údajů
- Odpověď bude obsahovat:
- kód odpovědi označující výsledek operace
- uživatelské jméno, pokud je k dispozici
- heslo, pokud je k dispozici
Získání souborů v balíčku
- Směr žádosti: NuGet – modul plug-in>
- Požadavek bude obsahovat:
- ID a verze balíčku
- umístění zdrojového úložiště balíčku
- Odpověď bude obsahovat:
- kód odpovědi označující výsledek operace
- Výčet cest k souborům v balíčku, pokud byla operace úspěšná
Získání deklarací identity operací
- Směr žádosti: NuGet – modul plug-in>
- Požadavek bude obsahovat:
- index.json služby pro zdroj balíčku
- umístění zdrojového úložiště balíčku
- Odpověď bude obsahovat:
- kód odpovědi označující výsledek operace
- výčet podporovaných operací (např. stažení balíčku), pokud byla operace úspěšná. Pokud modul plug-in nepodporuje zdroj balíčků, modul plug-in musí vrátit prázdnou sadu podporovaných operací.
Poznámka:
Tato zpráva byla aktualizována ve verzi 2.0.0. Je na klientovi, aby se zachovala zpětná kompatibilita.
Získání hodnoty hash balíčku
- Směr žádosti: NuGet – modul plug-in>
- Požadavek bude obsahovat:
- ID a verze balíčku
- umístění zdrojového úložiště balíčku
- algoritmus hash
- Odpověď bude obsahovat:
- kód odpovědi označující výsledek operace
- hodnota hash souboru balíčku pomocí požadovaného hash algoritmu, pokud operace proběhla úspěšně
Získání verzí balíčků
- Směr žádosti: NuGet – modul plug-in>
- Požadavek bude obsahovat:
- ID balíčku
- umístění zdrojového úložiště balíčku
- Odpověď bude obsahovat:
- kód odpovědi označující výsledek operace
- výčet verzí balíčku, pokud byla operace úspěšná
Získání indexu služby
- Směr žádosti: modul plug-in –> NuGet
- Požadavek bude obsahovat:
- umístění zdrojového úložiště balíčku
- Odpověď bude obsahovat:
- kód odpovědi označující výsledek operace
- index služby, pokud operace proběhla úspěšně
Handshake
- Směr žádosti: NuGet <– modul plug-in>
- Požadavek bude obsahovat:
- aktuální verze protokolu modulu plug-in
- minimální podporovaná verze protokolu plug-in
- Odpověď bude obsahovat:
- kód odpovědi označující výsledek operace
- pokud byla operace úspěšná, vyjednaná verze protokolu. Selhání způsobí ukončení modulu plug-in.
Inicializace
- Směr žádosti: NuGet – modul plug-in>
- Požadavek bude obsahovat:
- verze klientského nástroje NuGet
- efektivní jazyk klientského nástroje NuGet. To bere v úvahu nastavení ForceEnglishOutput, pokud se používá.
- výchozí časový limit požadavku, který nahrazuje výchozí protokol.
- Odpověď bude obsahovat:
- kód odpovědi označující výsledek operace. Selhání způsobí ukončení modulu plug-in.
Protokol
- Směr žádosti: modul plug-in –> NuGet
- Požadavek bude obsahovat:
- úroveň protokolu pro požadavek
- zpráva, která se má protokolovat
- Odpověď bude obsahovat:
- kód odpovědi označující výsledek operace.
Monitorování ukončení procesu NuGet
- Směr žádosti: NuGet – modul plug-in>
- Požadavek bude obsahovat:
- ID procesu NuGet
- Odpověď bude obsahovat:
- kód odpovědi označující výsledek operace.
Předběžné načtení balíčku
- Směr žádosti: NuGet – modul plug-in>
- Požadavek bude obsahovat:
- ID a verze balíčku
- umístění zdrojového úložiště balíčku
- Odpověď bude obsahovat:
- kód odpovědi označující výsledek operace
Nastavení přihlašovacích údajů
- Směr žádosti: NuGet – modul plug-in>
- Požadavek bude obsahovat:
- umístění zdrojového úložiště balíčku
- poslední známé zdrojové uživatelské jméno balíčku, pokud je k dispozici
- poslední známé heslo ke zdroji balíčku, pokud je k dispozici
- poslední známé uživatelské jméno proxy serveru, pokud je k dispozici
- poslední známé heslo proxy serveru, pokud je k dispozici
- Odpověď bude obsahovat:
- kód odpovědi označující výsledek operace
Nastavení úrovně protokolu
- Směr žádosti: NuGet – modul plug-in>
- Požadavek bude obsahovat:
- výchozí úroveň protokolu
- Odpověď bude obsahovat:
- kód odpovědi označující výsledek operace
Zprávy protokolu verze 2.0.0
- Získání deklarací identity operací
Směr žádosti: NuGet – modul plug-in>
- Požadavek bude obsahovat:
- index.json služby pro zdroj balíčku
- umístění zdrojového úložiště balíčku
- Odpověď bude obsahovat:
- kód odpovědi označující výsledek operace
- výčet podporovaných operací, pokud byla operace úspěšná. Pokud modul plug-in nepodporuje zdroj balíčků, modul plug-in musí vrátit prázdnou sadu podporovaných operací.
Pokud má index služby a zdroj balíčku hodnotu null, může modul plug-in odpovědět s ověřováním.
- Požadavek bude obsahovat:
- Získání přihlašovacích údajů pro ověřování
- Směr žádosti: NuGet – modul plug-in>
- Požadavek bude obsahovat:
- Identifikátor URI
- isRetry
- Neinteraktivní
- CanShowDialog
- Odpověď bude obsahovat
- Username
- Heslo
- Zpráva
- Seznam typů ověřování
- MessageResponseCode