Birden çok .NET sürümünü destekleme
Birçok kitaplık.NET Framework'ün belirli bir sürümünü hedefler. Örneğin, kitaplığınızın UWP'ye özgü bir sürümüne ve .NET Framework 4.6'daki özelliklerden yararlanan başka bir sürümüne sahip olabilirsiniz. NuGet, buna uyum sağlamak için aynı kitaplığın birden çok sürümünü tek bir pakete yerleştirmeyi destekler.
Bu makalede, bir NuGet paketinin düzeni, paketin veya derlemelerin nasıl oluşturulduğundan bağımsız olarak açıklanır (yani, birden çok SDK stilinde olmayan .csproj dosyası ve özel bir .nuspec dosyası ya da tek bir çok hedefli SDK stili .csproj kullanıldığında düzen aynıdır). SDK stilinde bir proje için NuGet paketi hedefleri paketin nasıl düzenlenmesi gerektiğini bilir ve derlemeleri doğru lib klasörlerine yerleştirmeyi ve her hedef çerçeve (TFM) için bağımlılık grupları oluşturmayı otomatikleştirir. Ayrıntılı yönergeler için bkz . Proje dosyanızda birden çok .NET Framework sürümünü destekleme.
Paket oluşturma bölümünde açıklanan kural tabanlı çalışma dizini yöntemini kullanırken paketi bu makalede açıklandığı gibi el ile düzenlemelisiniz. SDK stilinde bir proje için otomatik yöntem önerilir, ancak paketi bu makalede açıklandığı gibi el ile düzenlemeyi de seçebilirsiniz.
Çerçeve sürümü klasör yapısı
Bir kitaplığın yalnızca bir sürümünü içeren veya birden çok çerçeveyi hedefleyen bir paket oluştururken, aşağıdaki kurala sahip farklı büyük/küçük harfe duyarlı çerçeve adları kullanarak alt klasörler lib
oluşturursunuz:
lib\{framework name}[{version}]
Desteklenen adların tam listesi için bkz . Hedef Çerçeveler başvurusu.
Kitaplığın bir çerçeveye özgü olmayan ve doğrudan kök lib
klasöre yerleştirilmiş bir sürümüne sahip olmamalıdır. (Bu özellik yalnızca ile packages.config
desteklendi). Bunun yapılması kitaplığın herhangi bir hedef çerçeveyle uyumlu olmasını sağlar ve herhangi bir yere yüklenmesine izin verir ve bu da büyük olasılıkla beklenmeyen çalışma zamanı hatalarına neden olur. Kök klasöre (örneğin lib\abc.dll
) veya alt klasörlere (gibi lib\abc\abc.dll
) derleme ekleme işlemi kullanım dışı bırakıldı ve PackagesReference biçimi kullanılırken yoksayıldı.
Örneğin, aşağıdaki klasör yapısı bir derlemenin çerçeveye özgü dört sürümünü destekler:
\lib
\net46
\MyAssembly.dll
\net461
\MyAssembly.dll
\uap
\MyAssembly.dll
\netcore
\MyAssembly.dll
Paketi oluştururken tüm bu dosyaları kolayca eklemek için, öğesinin bölümünde özyinelemeli **
bir joker karakter <files>
kullanın:.nuspec
<files>
<file src="lib\**" target="lib/{framework name}[{version}]" />
</files>
Mimariye özgü klasörler
Mimariye özgü derlemeleriniz varsa, yani ARM, x86 ve x64'i hedefleyen ayrı derlemeleriniz varsa, bunları veya {platform}-{architecture}\native
adlı {platform}-{architecture}\lib\{framework}
alt klasörler içinde adlı runtimes
bir klasöre yerleştirmeniz gerekir. Örneğin, aşağıdaki klasör yapısı windows 10'a ve çerçeveye yönelik yerel ve uap10.0
yönetilen DLL'leri barındırabilir:
\runtimes
\win10-arm
\native
\lib\uap10.0
\win10-x86
\native
\lib\uap10.0
\win10-x64
\native
\lib\uap10.0
Bu derlemeler yalnızca çalışma zamanında kullanılabilir, bu nedenle ilgili derleme zamanı derlemesini sağlamak ve ardından derlemeyi /ref/{tfm}
klasörde kullanmak AnyCPU
istiyorsanız.
NuGet'in her zaman bu derleme veya çalışma zamanı varlıklarını bir klasörden seçtiğini unutmayın. Bu nedenle, bu klasörden /ref
/lib
bazı uyumlu varlıklar varsa derleme zamanı derlemeleri eklemek için yoksayılır. Benzer şekilde, bu tarihten itibaren /runtimes
bazı uyumlu varlıklar varsa çalışma zamanı için de /lib
yoksayılır.
Bildirimde .nuspec
bu dosyalara başvurma örneği için bkz. UWP Paketleri Oluşturma.
Ayrıca bkz . NuGet ile Windows mağazası uygulaması bileşenini paketleme
Projede derleme sürümleriyle hedef çerçeveyi eşleştirme
NuGet birden çok derleme sürümüne sahip bir paket yüklediğinde, derlemenin çerçeve adını projenin hedef çerçevesiyle eşleştirmeye çalışır.
Eşleşme bulunmazsa NuGet, varsa projenin hedef çerçevesine eşit veya ondan küçük en yüksek sürüm için derlemeyi kopyalar. Uyumlu bir derleme bulunmazsa NuGet uygun bir hata iletisi döndürür.
Örneğin, bir pakette aşağıdaki klasör yapısını göz önünde bulundurun:
\lib
\net45
\MyAssembly.dll
\net461
\MyAssembly.dll
Bu paketi .NET Framework 4.6'yı hedefleyen bir projeye yüklerken NuGet, derlemeyi net45
klasöre yükler çünkü bu, 4.6'dan küçük veya buna eşit olan en yüksek kullanılabilir sürümdür.
Proje .NET Framework 4.6.1'i hedeflerse, diğer yandan NuGet derlemeyi net461
klasörüne yükler.
Proje .NET framework 4.0 ve önceki sürümleri hedeflerse, NuGet uyumlu derlemeyi bulamamaya yönelik uygun bir hata iletisi oluşturur.
Derlemeleri çerçeve sürümüne göre gruplandırma
NuGet, derlemeleri paketteki tek bir kitaplık klasöründen kopyalar. Örneğin, bir paketin aşağıdaki klasör yapısına sahip olduğunu varsayalım:
\lib
\net40
\MyAssembly.dll (v1.0)
\MyAssembly.Core.dll (v1.0)
\net45
\MyAssembly.dll (v2.0)
Paket .NET Framework 4.5'i hedefleyen bir projeye yüklendiğinde yüklenen MyAssembly.dll
tek derleme (v2.0) olur. MyAssembly.Core.dll
(v1.0) klasörde listelenmediğinden net45
yüklenmedi. NuGet bu şekilde davranır çünkü MyAssembly.Core.dll
sürümü 2.0 ile MyAssembly.dll
birleştirilmiş olabilir.
.NET Framework 4.5 için yüklenmesini istiyorsanız MyAssembly.Core.dll
, klasörüne net45
bir kopya yerleştirin.
Derlemeleri çerçeve profiline göre gruplandırma
NuGet, klasörün sonuna tire ve profil adı ekleyerek belirli bir çerçeve profilini hedeflemeyi de destekler.
lib{framework name}-{profile}
Desteklenen profiller aşağıdaki gibidir:
client
: İstemci Profilifull
: Tam Profilwp
: Windows Telefoncf
: Compact Framework
Bağımlılıkları bildirme (Gelişmiş)
NuGet, proje dosyasını paketlerken projeden bağımlılıkları otomatik olarak oluşturmaya çalışır. Bu bölümde bağımlılıkları bildirmek için .nuspec dosyası kullanmayla ilgili bilgiler genellikle yalnızca gelişmiş senaryolar için gereklidir.
(Sürüm 2.0+) öğesindeki öğeleri <dependencies>
kullanarak <group>
hedef projenin hedef çerçevesine karşılık gelen .nuspec içinde paket bağımlılıklarını bildirebilirsiniz. Daha fazla bilgi için bkz . bağımlılıklar öğesi.
Her grubun adlı targetFramework
bir özniteliği vardır ve sıfır veya daha fazla <dependency>
öğe içerir. Hedef çerçeve projenin çerçeve profiliyle uyumlu olduğunda bu bağımlılıklar birlikte yüklenir. Tam çerçeve tanımlayıcıları için bkz. Hedef çerçeveler.
Lib/ ve ref/ klasörlerindeki dosyalar için Hedef Çerçeve Takma Adı (TFM) başına bir grup kullanmanızı öneririz.
Aşağıdaki örnek, öğesinin <group>
farklı çeşitlemelerini gösterir:
<dependencies>
<group targetFramework="net472">
<dependency id="jQuery" version="1.10.2" />
<dependency id="WebActivatorEx" version="2.2.0" />
</group>
<group targetFramework="net20">
</group>
</dependencies>
Hangi NuGet hedefinin kullanılacağını belirleme
Taşınabilir Sınıf Kitaplığını hedefleyen kitaplıkları paketlemek, özellikle de PCL'nin yalnızca bir alt kümesini hedeflerken, klasör adlarınızda ve .nuspec
dosyanızda hangi NuGet hedefini kullanmanız gerektiğini belirlemek zor olabilir. Aşağıdaki dış kaynaklar bu konuda size yardımcı olacaktır:
- .NET'te çerçeve profilleri (stephencleary.com)
- Taşınabilir Sınıf Kitaplığı profilleri (plnkr.co): PCL profillerini ve eşdeğer NuGet hedeflerini numaralandıran tablo
- Taşınabilir Sınıf Kitaplığı profil aracı (github.com): sisteminizde kullanılabilen PCL profillerini belirlemek için komut satırı aracı
İçerik dosyaları ve PowerShell betikleri
Uyarı
Değiştirilebilir içerik dosyaları ve betik yürütme yalnızca biçimiyle packages.config
kullanılabilir; diğer tüm biçimlerde kullanım dışıdır ve yeni paketler için kullanılmamalıdır.
ile packages.config
içerik dosyaları ve PowerShell betikleri, ve tools
klasörlerinin içinde aynı klasör kuralı kullanılarak hedef çerçeveye content
göre gruplandırılabilir. Örneğin:
\content
\net46
\MyContent.txt
\net461
\MyContent461.txt
\uap
\MyUWPContent.html
\netcore
\tools
init.ps1
\net46
install.ps1
uninstall.ps1
\uap
install.ps1
uninstall.ps1
Bir çerçeve klasörü boş bırakılırsa NuGet derleme başvuruları veya içerik dosyaları eklemez veya bu çerçeve için PowerShell betiklerini çalıştırmaz.
Not
init.ps1
Çözüm düzeyinde yürütülür ve projeye bağımlı olmadığından doğrudan klasörün altına tools
yerleştirilmelidir. Bir çerçeve klasörüne yerleştirilirse yoksayılır.