Aracılığıyla paylaş


Kavram: özellikler

Özellikler

Özellikler, yükleme sonrasında bir pakete veya projeye seçmeli olarak eklenebilen işlev, davranış ve bağımlılık kümelerini temsil eder.

Tasarım gereği özellikler şu ilkeleri izlemelidir:

  • Ekleme: Özelliğin etkinleştirilmesi, başka bir işlevi devre dışı bırakmadan pakette eksik olan yeni işlevler sağlamalıdır.
  • Özel olmayan: Bir özelliğin etkinleştirilmesi diğer özelliklerin yüklenmesini engellememelidir.

Özellikler, alternatif işlev kümelerini tanımlamak için kullanılmamalıdır. Örneğin, bir grafik kitaplığı özel grafik arka uçları arasında seçim yapmak için özellikleri kullanmamalıdır, çünkü bunların tümünü aynı anda yüklemek mümkün değildir.

Özelliklerin bir paketin bağımlılıkları üzerinde aşağıdaki etkileri olabilir:

  • Aynı paketten diğer özelliklere bağımlılıklar da dahil olmak üzere yeni bağımlılıklar ekleyin.
  • Mevcut bağımlılıklarda yeni özellikleri etkinleştirin.

Kullanılabilir özellik kümesi alanı tarafından "features" tanımlanır.

Örnek 1: Birden çok dosya biçimi

Örneğin bir görüntü işleme kitaplığı, farklı kitaplık kümelerine bağlı olarak birkaç farklı görüntü türünü destekleyebileceğinden.

{
  "name": "my-image-lib",
  "version": "0.1",
  "features": {
    "png": { "description": "Support PNG files", "dependencies": ["libpng"]},
    "jpeg": { "description": "Support JPEG files", "dependencies": ["libjpeg-turbo"]},
    "tiff": { "description": "Support TIFF files", "dependencies": ["libtiff"]},
  }
}

Varsayılan özellikler

Varsayılan özellikler, üst düzey proje bunlar olmadan açıkça derleme isteğinde bulunmuyorsa otomatik olarak etkinleştirilecek bir özellik kümesidir. Varsayılan özellikler, projenin bağımlılık grafiğinin ne kadar karmaşık ve özelleştirilebilir olduğuna bakılmaksızın en düşük düzeyde işlevsellik sağlamaya yöneliktir.

Not

Varsayılan özelliklerin "curation" veya "suggestions" modellemesi amaçlanmamıştır.

Örneğin, oldukça belirsiz olan birkaç arşiv biçimi de dahil olmak üzere 10'un üzerinde farklı arşiv biçimi destekleyen bir kitaplık "extract-any" düşünün. Bunların tümü isteğe bağlı olduğundan, hiçbiri seçilmezse kitaplık işlevsel değildir: hiçbir dosyayı ayıklayamaz.

Varsayılan özellikler, yalnızca bağımlılık listesine vcpkg.json eklenen "extract-any" bir kullanıcının temel düzeyde işlevsellik elde etmesini sağlar; örneğin, otomatik olarak seçme .zip ve .tar.gz sıkıştırmaları açma.

Örnek 2: Varsayılan özellikler iş başında

Bir kullanıcı özellikleri belirtmeden kendi vcpkg.json özelliklerine eklendiğinde"extract-any", varsayılan özellikler (örneğin, ve biçimleri için .zip destek) otomatik olarak dahil edilir ve .tar.gz temel işlevler sağlanır.

{
  "name": "my-application",
  "version": "0.15.2",
  "dependencies": [
    "extract-any"
  ]
}

Kullanıcı varsayılan özellikleri açıkça devre dışı bırakmak istiyorsa, bunu bağımlılığına ekleyerek "default-features": false yapabilir:

{
  "name": "my-application",
  "version": "0.15.2",
  "dependencies": [
    {
      "name": "extract-any",
      "default-features": false
    }
  ]
}

Alternatif olarak, vcpkg'yi klasik modda kullanıyorsanız, özellik aracılığıyla core varsayılan özellikleri devre dışı bırakabilirsiniz. Örneğin, vcpkg install extract-any[core] açıkça dışlanan varsayılan özellikler [core] olmadan yüklerextract-any.

Daha fazla bilgi için varsayılan özellikler makalesine bakın.

Bağımlılık çözümlemesi

Vcpkg kullanırken bağımlılık çözümlemesi, özellikle bağımlılıkları olan özelliklerle ilgilenirken önemli bir rol oynar. Bunu göstermek için, bir görüntü işleme kitaplığını içeren aşağıdaki senaryoyu göz önünde bulundurun:

{
  "name": "my-image-lib",
  "version": "0.1",
  "features": {
    "png": { "description": "Support PNG files", "dependencies": ["libpng"]},
    "jpeg": { "description": "Support JPEG files", "dependencies": ["libjpeg-turbo"]},
    "tiff": { "description": "Support TIFF files", "dependencies": ["libtiff"]},
  }
}

Farklı kitaplıkların ortak bir kitaplığın çeşitli özelliklerine bağımlı olduğu senaryolarda, vcpkg tüm gerekli özelliklerin ve bağımlılıkların dikkate alınmasını sağlar. Örneğin, özelliği gerektiriyorsa ve özelliğinden my-image-libgerektiriyorsa library-a jpeg bağımlılık grafı şöyle görünür:library-b png

{
  "name": "library-a",
  "version": "1",
  "dependencies": [{"name": "my-image-lib", "features": ["png"]}]
}
{
  "name": "library-b",
  "version": "1",
  "dependencies": [{"name": "my-image-lib", "features": ["jpeg"]}]
}
{
  "name": "project-using-a-and-b",
  "version": "1",
  "dependencies": [
    "library-a",
    "library-b"
  ]
}

Bu bağımlılıklar çözümlendiğinde vcpkg, kapsamlı bir yükleme planı oluşturmak için tüm gerekli özellikleri ve bağımlılıkları birleştirir. Bu örnekte, hem hem de library-a öğesine bağlı olarak bir proje, hem hem de JPEG PNG desteği içeren my-image-libbir yükleme planına neden olur, ancak öğesini içermezTIFF:library-b

libjpeg-turbo[core]
libpng[core]
library-a[core]
library-b[core]
my-image-lib[core,png,jpeg]

Bu mekanizma, derlemesinin my-image-lib gerekli özellikler için iyileştirilmesini sağlar ve gereksiz TIFF desteği dışlarken ve JPEG için PNG destek sağlar.

Gelişmiş kullanım

Tek bir depo, bazı paylaşılan kodlara sahip istemci ve sunucu uygulamaları gibi birkaç ayrı derlenebilir bileşen içerdiğinde, her bir parçanın geliştiricileri diğer parçaların gerektirdiği pahalı bağımlılıkları yüklemekten kaçınmak isteyebilir.

{
  "name": "my-game",
  "dependencies": ["grpc"],
  "features": {
    "client": { "description": "Client Game Executable", "dependencies": ["sdl2", "bullet3"]},
    "server": { "description": "Multiplayer Server Executable", "dependencies": ["proxygen"]},
    "tests": { "description": "Build tests", "dependencies": ["gtest"] }
  }
}

Ardından tek tek geliştiriciler hangi özelliklerin yükleneceğini seçebilir:

Daha fazla bilgi için, aşağıdakilere bakın: