Aracılığıyla paylaş


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 tek bir sürümünü içeren ya da birden fazla framework'ü hedefleyen bir paket oluştururken, aşağıdaki kurala göre farklı büyük/küçük harfe duyarlı framework adları kullanarak lib altında her zaman alt klasörler yaparsınız:

lib\{framework name}[{version}]

Desteklenen adların tam listesi için bkz. Hedef Çerçeveler başvurusu.

Asla bir çerçeveye özgü olmayan ve doğrudan kök lib klasörüne yerleştirilen bir kitaplık versiyonuna sahip olmamalısınız. (Bu özellik yalnızca packages.config ile 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 (örneğin lib\abc\abc.dll) derleme eklenmesi artık desteklenmiyor ve "PackagesReference" formatı kullanıldığında yoksayılıyor.

Ö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, .nuspec dosyanızın <files> bölümünde özyinelemeli ** karakteri kullanın.

<files>
    <file src="lib\**" target="lib/{framework name}[{version}]" />
</files>

Mimariye özgü klasörler

Mimariye özgü derlemeleriniz varsa, yani ARM, x86 ve x64'ü hedefleyen ayrı derlemeleriniz varsa, bunları runtimes adlı bir klasör içinde {platform}-{architecture}\lib\{framework} veya {platform}-{architecture}\native adlı alt klasörlerin içinde 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 mevcut olacak, bu nedenle derleme zamanı derlemesini de sağlamak istiyorsanız, AnyCPU derlemesini /ref/{tfm} klasöründe bulundurun.

NuGet'in her zaman bu derleme veya çalışma zamanı varlıklarını tek bir klasörden seçtiğini unutmayın. Eğer /ref klasöründe bazı uyumlu varlıklar varsa, derleme zamanı derlemelerini eklemek için /lib görmezden gelinecektir. Benzer şekilde, /runtimes'den bazı uyumlu varlıklar varsa, /lib çalışma zamanı için de yoksayılacaktır.

Bildirimde bu dosyalara başvurma örneği için bkz. .nuspec.

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 Phone
  • 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+) Paket bağımlılıklarını, hedef projenin hedef çerçevesine uygun <group> öğesini <dependencies> içinde kullanarak .nuspec dosyasında 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.

packages.config ile içerik dosyaları ve PowerShell betikleri, content ve tools klasörlerinin içinde aynı klasör kuralı kullanılarak hedef çerçeveye 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.

Uyarı

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ştirildiğinde göz ardı edilir.