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.configdesteklendi). 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}\nativeadlı {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.dllbirleş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 Profili
  • full: Tam Profil
  • wp: Windows Telefon
  • cf: 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:

İç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.configiç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.