1+ #!/usr/local/share/dotnet/dotnet run
2+ // Файл file-based app скрипта для ожидания появления указанной версии NuGet пакета на сервере.
3+ // Использование: dotnet run .scripts/nuget-ver-wait.cs <package-name> <target-version> [-n <tries>] [-t <timeout-ms>]
4+
5+ #nullable enable
6+
7+ #: package NuGet . Protocol@7.0 .1
8+ #: package NuGet . Configuration@7.0 .1
9+
10+ using System ;
11+ using System . Linq ;
12+ using System . Threading ;
13+ using System . Threading . Tasks ;
14+ using NuGet . Common ;
15+ using NuGet . Configuration ;
16+ using NuGet . Protocol ;
17+ using NuGet . Protocol . Core . Types ;
18+ using NuGet . Versioning ;
19+
20+ if ( args . Length < 2 )
21+ {
22+ Console . Error . WriteLine ( "Usage: dotnet run .scripts/nuget-ver-wait.cs <package-name> <target-version> [-n <tries>] [-t <timeout-ms>]" ) ;
23+ Environment . Exit ( 1 ) ;
24+ }
25+
26+ var package_name = args [ 0 ] ; // имя пакета
27+ var target_version_str = args [ 1 ] ; // требуемая версия
28+ if ( string . IsNullOrWhiteSpace ( package_name ) || string . IsNullOrWhiteSpace ( target_version_str ) )
29+ {
30+ Console . Error . WriteLine ( "Package name or target version is empty" ) ;
31+ Environment . Exit ( 1 ) ;
32+ }
33+
34+ // Значения по умолчанию
35+ var tries = 10 ; // -n по умолчанию
36+ var timeout_ms = 1000 ; // -t по умолчанию
37+
38+ // Разбор дополнительных аргументов
39+ for ( var i = 2 ; i < args . Length ; i ++ )
40+ {
41+ var a = args [ i ] ;
42+ const StringComparison cmp = StringComparison . OrdinalIgnoreCase ;
43+ if ( string . Equals ( a , "-n" , cmp ) && i + 1 < args . Length )
44+ {
45+ if ( int . TryParse ( args [ ++ i ] , out var v ) ) tries = v ;
46+ }
47+ else if ( string . Equals ( a , "-t" , cmp ) && i + 1 < args . Length )
48+ {
49+ if ( int . TryParse ( args [ ++ i ] , out var v ) ) timeout_ms = v ;
50+ }
51+ }
52+
53+ if ( tries <= 0 ) tries = 1 ;
54+ if ( timeout_ms < 0 ) timeout_ms = 0 ;
55+
56+ if ( ! NuGetVersion . TryParse ( target_version_str , out var target_version ) )
57+ {
58+ Console . Error . WriteLine ( $ "Невозможно распарсить целевую версию: { target_version_str } ") ;
59+ Environment . Exit ( 1 ) ;
60+ }
61+
62+ Console . WriteLine ( $ "Ожидание версии { target_version } пакета { package_name } на nuget.org ({ tries } попыток, таймаут { timeout_ms } ms)") ;
63+
64+ try
65+ {
66+ var source_repo = Repository . Factory . GetCoreV3 ( "https://api.nuget.org/v3/index.json" ) ;
67+ using var cache = new SourceCacheContext ( ) ;
68+ var logger = NullLogger . Instance ;
69+ var resource = await source_repo . GetResourceAsync < PackageMetadataResource > ( ) ;
70+
71+ for ( var attempt = 1 ; attempt <= tries ; attempt ++ )
72+ {
73+ // Получим метаданные пакета
74+ var metadata = await resource . GetMetadataAsync ( package_name , includePrerelease : true , includeUnlisted : false , cache , logger , CancellationToken . None ) ;
75+ var metadata_list = metadata ? . ToList ( ) ?? [ ] ;
76+
77+ if ( metadata_list . Count == 0 )
78+ Console . WriteLine ( $ "[{ attempt } /{ tries } ] Пакет не найден на сервере") ;
79+ else
80+ {
81+ var versions = metadata_list
82+ . Select ( m => m . Identity . Version )
83+ . Where ( v => v is not null )
84+ . OrderByDescending ( v => v )
85+ . ToArray ( ) ;
86+
87+ if ( versions . Length == 0 )
88+ Console . WriteLine ( $ "[{ attempt } /{ tries } ] На сервере нет версий пакета") ;
89+ else
90+ {
91+ var latest = versions [ 0 ] ;
92+ Console . WriteLine ( $ "[{ attempt } /{ tries } ] Серверная последняя версия: { latest } ") ;
93+
94+ // Сравним последнюю серверную версию с целевой
95+ if ( latest < target_version )
96+ Console . WriteLine ( $ "Серверная версия { latest } младше требуемой { target_version } , ожидаем...") ;
97+ else
98+ {
99+ Console . WriteLine ( $ "Требуемая версия { target_version } доступна на сервере (серверная версия { latest } )") ;
100+ Environment . Exit ( 0 ) ;
101+ }
102+ }
103+ }
104+
105+ if ( attempt < tries )
106+ await Task . Delay ( timeout_ms ) ;
107+ }
108+
109+ Console . Error . WriteLine ( $ "Не удалось дождаться версии { target_version } для пакета { package_name } после { tries } попыток") ;
110+ Environment . Exit ( 2 ) ;
111+ }
112+ catch ( Exception ex )
113+ {
114+ Console . Error . WriteLine ( $ "Ошибка: { ex . Message } ") ;
115+ Environment . Exit ( 2 ) ;
116+ }
0 commit comments