nuget.org'de yayımlanan tüm paketler için sorgu
Eski OData V2 API'sinde yaygın olarak kullanılan sorgu desenlerinden biri, nuget.org yayımlanan tüm paketlerin listelendiği sırada sıralanıyordu. nuget.org için bu tür bir sorgu gerektiren senaryolar büyük ölçüde farklılık gösterir:
- nuget.org tamamen çoğaltma
- Paketlerde yeni sürümlerin ne zaman yayınlanacak olduğunu algılama
- Paketinize bağlı paketleri bulma
Bunu yapmanın eski yolu genellikle ve (sayfa boyutu) parametrelerini kullanarak skip
top
OData paket varlığını bir zaman damgasına göre sıralamaya ve büyük sonuç kümesinde sayfalandırmaya bağlıdır. Ne yazık ki bu yaklaşımın bazı dezavantajları vardır:
- Genellikle sırayı değiştiren verilerde sorgular yapıldığından eksik paket olasılığı
- Sorgular iyileştirilmediğinden yavaş sorgu yanıt süresi (en iyi duruma getirilmiş sorgular, resmi NuGet istemcisi için ana hat senaryosunu destekleyen sorgulardır)
- Kullanım dışı ve belgelenmemiş API kullanımı, gelecekte bu tür sorguların desteklenmemesi anlamına gelir
- Geçmişin tam sırasına göre yeniden oynatılaamaması
Bu nedenle, yukarıda belirtilen senaryoları daha güvenilir ve geleceğe dayanıklı bir şekilde ele almak için aşağıdaki kılavuz takip edilebilir.
Genel bakış
Bu kılavuzun merkezinde NuGet API'sindeki katalog adı verilen kaynak yer alır. Katalog, çağıranın nuget.org eklenen, değiştirilen ve silinen paketlerin tam geçmişini görmesine olanak tanıyan yalnızca ekleme API'leridir. nuget.org yayımlanan paketlerin tümünü ve hatta bir alt kümesini ilgilendiriyorsanız katalog, zaman geçtikçe şu anda kullanılabilir olan paket kümesiyle güncel kalmanın harika bir yoludur.
Bu kılavuz üst düzey bir kılavuz olarak tasarlanmıştır, ancak kataloğun ayrıntılı ayrıntılarıyla ilgileniyorsanız API başvuru belgesine bakın.
Aşağıdaki adımlar istediğiniz herhangi bir programlama dilinde uygulanabilir. Tam çalışan bir örnek istiyorsanız, aşağıda bahsedilen C# örneğine göz atın.
Aksi takdirde, güvenilir bir katalog okuyucu oluşturmak için aşağıdaki kılavuzu izleyin.
İmleci başlatma
Güvenilir bir katalog okuyucu oluşturmanın ilk adımı bir imleç uygulamaktır. Katalog imlecinin tasarımı hakkında tüm ayrıntılar için katalog başvuru belgesine bakın. Kısaca ifade etmek gerekirse imleç, katalogdaki olayları işlediğiniz bir zaman noktasıdır. Katalogdaki olaylar paket yayımlamalarını ve diğer paket değişikliklerini temsil eder. NuGet'te yayımlanan tüm paketleri önemsiyorsanız (zamanın başlangıcından bu yana), imlecinizi "en düşük değer" zaman damgasına (ör. DateTime.MinValue
.NET'te) başlatırsınız. Yalnızca şu andan itibaren yayımlanan paketleri önemsiyorsanız, ilk imleç değeri olarak geçerli zaman damgasını kullanırsınız.
Bu kılavuz için, imlecimizi bir saat önce bir zaman damgasına başlatacağız. Şimdilik bu zaman damgasını belleğe kaydetmeniz yeter.
DateTime cursor = DateTime.UtcNow.AddHours(-1);
Katalog dizini URL'sini belirleme
NuGet API'sindeki her kaynağın (uç nokta) konumu hizmet dizini kullanılarak bulunmalıdır. Bu kılavuz nuget.org odaklandığından nuget.org'un hizmet dizinini kullanacağız.
GET https://api.nuget.org/v3/index.json
Hizmet belgesi, nuget.org üzerindeki tüm kaynakları içeren JSON belgesidir. özellik değerine Catalog/3.0.0
sahip @type
kaynağı arayın. İlişkili @id
özellik değeri, katalog dizininin URL'sidir.
Yeni katalog yaprakları bul
@id
Önceki adımda bulunan özellik değerini kullanarak katalog dizinini indirin:
GET https://api.nuget.org/v3/catalog0/index.json
Katalog dizinini seri durumdan çıkarma. Geçerli imleç değerinizden küçük veya buna eşit olan commitTimeStamp
tüm katalog sayfası nesnelerini filtreleyin.
Kalan her katalog sayfası için özelliğini kullanarak @id
belgenin tamamını indirin.
GET https://api.nuget.org/v3/catalog0/page2926.json
Katalog sayfasını seri durumdan çıkarma. Geçerli imleç değerinizden küçük veya buna eşit olan commitTimeStamp
tüm katalog yaprak nesnelerini filtreleyin.
Filtrelenmemiş tüm katalog sayfalarını indirdikten sonra, imleç zaman damgasınızla şimdi arasındaki sürede yayımlanmış, listelenmemiş, listelenmiş veya silinmiş paketleri temsil eden bir katalog yaprak nesneleri kümeniz olur.
Katalog yapraklarını işleme
Bu noktada, katalog öğelerinde istediğiniz özel işlemleri gerçekleştirebilirsiniz. Tek ihtiyacınız olan paketin kimliği ve sürümüyse, sayfalarda bulunan katalog öğesi nesnelerindeki ve nuget:version
özelliklerini inceleyebilirsiniznuget:id
. Katalog öğesinin @type
mevcut bir paketle mi yoksa silinmiş bir paketle mi ilgili olduğunu öğrenmek için özelliğine baktığından emin olun.
Paket hakkındaki meta verilerle ilgileniyorsanız (açıklama, bağımlılıklar, .nupkg boyutu vb.), katalog yaprak belgesini özelliğini kullanarak @id
getirebilirsiniz.
GET https://api.nuget.org/v3/catalog0/data/2015.02.01.11.18.40/windowsazure.storage.1.0.0.json
Bu belgede paket meta veri kaynağına dahil edilen tüm meta veriler ve daha fazlası var!
Bu adım, özel mantığınızı uyguladığınız adımdır. Bu kılavuzdaki diğer adımlar, katalog yapraklarıyla ne yaptığınız fark etmez, hemen hemen aynı şekilde uygulanır.
.nupkg dosyasını indirme
Katalogda bulunan paketler için .nupkg'ları indirmek istiyorsanız paket içerik kaynağını kullanabilirsiniz. Ancak, bir paketin katalogda bulunması ile paket içerik kaynağında kullanılabilir olması arasında kısa bir gecikme olduğunu unutmayın. Bu nedenle, katalogda bulduğunuz bir paket için .nupkg indirmeye çalışırken karşılaşırsanız 404 Not Found
, kısa bir süre sonra yeniden denemeniz yeterlidir. Bu gecikmeyi düzeltmek, GitHub sorunu NuGet/NuGetGallery#3455 tarafından izlenir.
İmleci ileri taşıma
Katalog öğelerini başarıyla işledikten sonra, kaydedilecek yeni imleç değerini belirlemeniz gerekir. Bunu yapmak için, işlediğiniz tüm katalog öğelerinin en yüksek (en son kronolojik) commitTimeStamp
sayısını bulun. Bu, yeni imleç değerinizdir. Bunu veritabanı, dosya sistemi veya blob depolama gibi kalıcı bir depoya kaydedin. Daha fazla katalog öğesi almak istediğinizde, imlecinizin değerini bu kalıcı depodan başlatarak ilk adımdan başlamanız yeterlidir.
Uygulamanız bir özel durum veya hata oluşturursa imleci ileri taşımayın. İmleci ileri taşımak, katalog öğelerini imlecinizden önce bir daha işlemeniz gerekmeyecek anlamına gelir.
Bazı nedenlerden dolayı katalog yapraklarını işleme şeklinizde bir hata varsa, imlecinizi zamanda geriye doğru hareket ettirebilir ve kodunuzun eski katalog öğelerini yeniden işlemesine izin verirseniz.
C# örnek kodu
Katalog, HTTP üzerinden kullanılabilen bir JSON belgeleri kümesi olduğundan, HTTP istemcisi ve JSON seri durumdan çıkarıcısı olan herhangi bir programlama dili kullanılarak etkileşime alınabilir.
C# örnekleri NuGet/Samples deposunda bulunur.
git clone https://github.com/NuGet/Samples.git
Katalog SDK'sı
Kataloğu kullanmanın en kolay yolu, aşağıdaki NuGet paketi kaynak URL'sini kullanarak Azure Artifacts'te bulunan yayın öncesi .NET katalog SDK'sı paketini NuGet.Protocol.Catalog
kullanmaktır: https://pkgs.dev.azure.com/dnceng/public/_packaging/nuget-build/nuget/v3/index.json
.
Bu paketi veya üzeriyle netstandard1.3
uyumlu bir projeye (.NET Framework 4.6 gibi) yükleyebilirsiniz.
Bu paketi kullanan bir örnek, NuGet.Protocol.Catalog.Sample projesinde GitHub'da kullanılabilir.
Örnek çıktı
2017-11-10T22:16:44.8689025+00:00: Found package details leaf for xSkrape.APIWrapper.REST 1.0.2.
2017-11-10T22:16:54.6972769+00:00: Found package details leaf for xSkrape.APIWrapper.REST 1.0.1.
2017-11-10T22:19:20.6385542+00:00: Found package details leaf for Platform.EnUnity 1.0.8.
...
2017-11-10T23:05:04.9695890+00:00: Found package details leaf for xSkrape.APIWrapper.Base 1.0.1.
2017-11-10T23:05:04.9695890+00:00: Found package details leaf for xSkrape.APIWrapper.Base 1.0.2.
2017-11-10T23:07:23.1303569+00:00: Found package details leaf for VeiculoX.Model 0.0.15.
Processing the catalog leafs failed. Retrying.
fail: NuGet.Protocol.Catalog.LoggerCatalogLeafProcessor[0]
10 catalog commits have been processed. We will now simulate a failure.
warn: NuGet.Protocol.Catalog.CatalogProcessor[0]
Failed to process leaf https://api.nuget.org/v3/catalog0/data/2017.11.10.23.07.23/veiculox.model.0.0.15.json (VeiculoX.Model 0.0.15, PackageDetails).
warn: NuGet.Protocol.Catalog.CatalogProcessor[0]
13 out of 59 leaves were left incomplete due to a processing failure.
warn: NuGet.Protocol.Catalog.CatalogProcessor[0]
1 out of 1 pages were left incomplete due to a processing failure.
2017-11-10T23:07:23.1303569+00:00: Found package details leaf for VeiculoX.Model 0.0.15.
2017-11-10T23:07:33.0212446+00:00: Found package details leaf for VeiculoX.Model 0.0.14.
2017-11-10T23:07:41.6621837+00:00: Found package details leaf for VeiculoX.Model 0.0.13.
2017-11-10T23:09:58.5728614+00:00: Found package details leaf for CreaSoft.Composition.Web.Extensions 1.1.0.
2017-11-10T23:09:58.5728614+00:00: Found package details leaf for DarkXaHTeP.Extensions.Configuration.Consul 0.0.4.
2017-11-10T23:09:58.5728614+00:00: Found package details leaf for xSkrape.APIWrapper.REST.Sample 1.0.3.
2017-11-10T23:10:09.0574930+00:00: Found package details leaf for Microsoft.VisualStudio.Imaging 15.4.27004.
2017-11-10T23:10:09.0574930+00:00: Found package details leaf for Microsoft.VisualStudio.Imaging.Interop.14.0.DesignTime 14.3.25407.
2017-11-10T23:10:09.0574930+00:00: Found package details leaf for Microsoft.VisualStudio.Language.Intellisense 15.4.27004.
2017-11-10T23:10:09.0574930+00:00: Found package details leaf for Microsoft.VisualStudio.Language.StandardClassification 15.4.27004.
2017-11-10T23:10:09.0574930+00:00: Found package details leaf for Microsoft.VisualStudio.ManagedInterfaces 8.0.50727.
2017-11-10T23:10:09.0574930+00:00: Found package details leaf for xSkrape.APIWrapper.REST.Sample 1.0.2.
2017-11-10T23:10:09.0574930+00:00: Found package details leaf for xSkrape.APIWrapper.REST.Sample 1.0.3.
En az örnek
Katalogla etkileşimi daha ayrıntılı olarak gösteren daha az bağımlılık içeren bir örnek için bkz . CatalogReaderExample örnek projesi. Proje, NuGet.Protocol 4.4.0 (hizmet dizinini çözümlemek için) ve Newtonsoft.Json 9.0.1'i (JSON seri durumdan çıkarma için) hedefler netcoreapp2.0
ve buna bağlıdır.
Kodun ana mantığı Program.cs dosyasında görünür.
Örnek çıktı
No cursor found. Defaulting to 11/2/2017 9:41:28 PM.
Fetched catalog index https://api.nuget.org/v3/catalog0/index.json.
Fetched catalog page https://api.nuget.org/v3/catalog0/page2935.json.
Processing 69 catalog leaves.
11/2/2017 9:32:35 PM: DotVVM.Compiler.Light 1.1.7 (type is nuget:PackageDetails)
11/2/2017 9:32:35 PM: Momentum.Pm.Api 5.12.181-beta (type is nuget:PackageDetails)
11/2/2017 9:32:44 PM: Momentum.Pm.PortalApi 5.12.181-beta (type is nuget:PackageDetails)
11/2/2017 9:35:14 PM: Genesys.Extensions.Standard 3.17.11.40 (type is nuget:PackageDetails)
11/2/2017 9:35:14 PM: Genesys.Extensions.Core 3.17.11.40 (type is nuget:PackageDetails)
11/2/2017 9:35:14 PM: Halforbit.DataStores.FileStores.Serialization.Bond 1.0.4 (type is nuget:PackageDetails)
11/2/2017 9:35:14 PM: Halforbit.DataStores.FileStores.AmazonS3 1.0.4 (type is nuget:PackageDetails)
11/2/2017 9:35:14 PM: Halforbit.DataStores.DocumentStores.DocumentDb 1.0.6 (type is nuget:PackageDetails)
11/2/2017 9:35:14 PM: Halforbit.DataStores.FileStores.BlobStorage 1.0.5 (type is nuget:PackageDetails)
...
11/2/2017 10:23:54 PM: Cake.GitPackager 0.1.2 (type is nuget:PackageDetails)
11/2/2017 10:23:54 PM: UtilPack.NuGet 2.0.0 (type is nuget:PackageDetails)
11/2/2017 10:23:54 PM: UtilPack.NuGet.AssemblyLoading 2.0.0 (type is nuget:PackageDetails)
11/2/2017 10:26:26 PM: UtilPack.NuGet.Deployment 2.0.0 (type is nuget:PackageDetails)
11/2/2017 10:26:26 PM: UtilPack.NuGet.Common.MSBuild 2.0.0 (type is nuget:PackageDetails)
11/2/2017 10:26:36 PM: InstaClient 1.0.2 (type is nuget:PackageDetails)
11/2/2017 10:26:36 PM: SecureStrConvertor.VARUN_RUSIYA 1.0.0.5 (type is nuget:PackageDetails)
Writing cursor value: 11/2/2017 10:26:36 PM.