Bagikan melalui


Konsep penerapan versi

Penerapan versi minimum

vcpkg menggunakan pendekatan pemilihan minimal untuk penerapan versi, terinspirasi oleh yang digunakan oleh Go, tetapi dimodifikasi dalam beberapa cara:

  • Selalu dimulai dari penginstalan baru, menghilangkan kebutuhan akan operasi peningkatan/penurunan tingkat.
  • Izinkan dependensi yang tidak dibatasi dengan memperkenalkan garis besar.

Namun, prinsip pemilihan minimal tetap sama. Mengingat serangkaian batasan, vcpkg akan menggunakan versi paket "terlama" yang mungkin yang dapat memenuhi semua batasan.

Menggunakan pendekatan versi minimum memiliki keuntungan berikut:

  • Ini dapat diprediksi dan mudah dipahami.
  • Kontrol pengguna saat peningkatan terjadi, seperti dalam, tidak ada peningkatan yang dilakukan secara otomatis saat versi baru dirilis.
  • Menghindari penggunaan pemecah SAT.

Untuk memberikan contoh, pertimbangkan grafik paket berikut:

    (A 1.0) -> (B 1.0)

    (A 1.1) -> (B 1.0) 
            -> (C 3.0) 

    (A 1.2) -> (B 2.0)
            -> (C 3.0)

    (C 2.0)

Dan manifes berikut:

{
    "name": "example",
    "version": "1.0.0",
    "dependencies": [ 
        { "name": "A", "version>=": "1.1" },
        { "name": "C", "version>=": "2.0" }
    ], 
    "builtin-baseline": "<some git commit with A's baseline at 1.0>"
}

Setelah memperhitungkan dependensi transitif, kami memiliki serangkaian batasan berikut:

  • A >= 1.1
    • B >= 1,0
    • C >= 3.0
  • C >= 2.0

Karena vcpkg harus memenuhi semua batasan, set paket yang diinstal menjadi:

  • A 1.1, bahkan ketika A 1.2 ada, tidak ada batasan yang lebih tinggi dari 1.1 sehingga vcpkg memilih versi minimum yang mungkin.
  • B 1.0, secara transitif diperlukan oleh A 1.1.
  • C 3.0, ditingkatkan oleh batasan transitif yang ditambahkan oleh A 1.1 untuk memenuhi batasan versi.

Resolusi batasan

Mengingat manifes dengan sekumpulan dependensi versi, vcpkg akan mencoba menghitung rencana penginstalan paket yang memenuhi semua batasan.

Batasan versi hadir dalam rasa berikut:

  • Batasan yang dinyatakan: Batasan dinyatakan secara eksplisit dalam manifes tingkat atas menggunakan version>=.
  • Batasan garis besar: Batasan ditambahkan secara implisit oleh builtin-baseline.
  • Batasan transitif: Batasan yang ditambahkan secara tidak langsung oleh dependensi dependensi Anda.
  • Penimpaan batasan: Batasan ditimpa dalam manifes tingkat atas menggunakan overrides deklarasi.

Untuk menghitung rencana penginstalan, vcpkg mengikuti kira-kira langkah-langkah berikut:

  • Tambahkan semua batasan tingkat atas ke paket.
  • Tambahkan batasan transitif secara rekursif ke paket.
    • Setiap kali paket baru ditambahkan ke paket, tambahkan juga batasan garis besarnya ke paket.
    • Setiap kali batasan ditambahkan:
    • Jika ada penimpaan untuk paket
      • Pilih versi dalam penimpaan.
    • Sebaliknya:
      • Jika tidak ada versi sebelumnya yang dipilih.
        • Pilih versi minimal yang memenuhi batasan.
      • Jika ada versi sebelumnya yang dipilih:
        • Jika skema penerapan versi batasan baru tidak cocok dengan versi yang dipilih sebelumnya:
          • Tambahkan konflik versi.
        • Jika versi batasan tidak sebanding dengan versi yang dipilih sebelumnya. Misalnya, membandingkan "version-string: apple" dengan "version-string: orange":
          • Tambahkan konflik versi.
        • Jika versi batasan lebih tinggi dari versi yang dipilih sebelumnya:
          • Pilih versi tertinggi.
        • Sebaliknya:
          • Pertahankan pilihan sebelumnya.
  • Tinjau paket:
    • Jika tidak ada konflik
      • Menginstal paket terpilih
    • Sebaliknya:
      • Melaporkan konflik kepada pengguna

Memperoleh versi port

Meskipun konsep versi paket selalu ada di vcpkg, konsep batasan versi belum.

Dengan pengenalan batasan penerapan versi, sekarang ada kemungkinan bahwa paket tergantung pada versi port yang tidak cocok dengan yang tersedia secara lokal. Ini menimbulkan masalah karena vcpkg perlu mengetahui cara memperoleh file port untuk versi yang diminta.

Untuk mengatasi masalah ini, sekumpulan file metadata baru diperkenalkan. File-file ini terletak di versions/ direktori di tingkat akar repositori vcpkg.

versions/ Direktori, akan berisi file JSON untuk masing-masing port yang tersedia di registri. Setiap file akan mencantumkan semua versi yang tersedia untuk paket dan berisi objek git tree-ish yang dapat dicek keluar vcpkg untuk mendapatkan portfiles versi tersebut.

Contoh: zlib.json

{
  "versions": [
    {
      "git-tree": "2dfc991c739ab9f2605c2ad91a58a7982eb15687",
      "version-string": "1.2.11",
      "port-version": 9
    },
    ...
    {
      "git-tree": "a516e5ee220c8250f21821077d0e3dd517f02631",
      "version-string": "1.2.10",
      "port-version": 0
    },
    {
      "git-tree": "3309ec82cd96d752ff890c441cb20ef49b52bf94",
      "version-string": "1.2.8",
      "port-version": 0
    }
  ]
}

Untuk setiap port, file versi yang sesuai harus terletak di versions/{first letter of port name}-/{port name}.json. Misalnya, file versi zlib akan terletak di versions/z-/zlib.json. Selain file versi port, file garis besar saat ini terletak di versions/baseline.json.