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-lib
gerektiriyorsa 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-lib
bir 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
Örnek 3: Tek Bir Depoda Birden Çok İlgili Proje
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:
- Yükleme komut satırında,
--x-feature=
- CMake Tümleştirmesi'ni kullanırken komutundan
project()
önce ayarlayınVCPKG_MANIFEST_FEATURES
. - MSBuild Tümleştirmesini kullanırken,
--x-feature=
VcpkgAdditionalInstallOptions
Daha fazla bilgi için, aşağıdakilere bakın: