Fissare le versioni dei plugin e dei temi per installazioni Discourse più vecchie (rami d-compat)

:open_book: Contesto

Gli sviluppatori di temi e plugin generalmente vogliono targeting l’ultima versione di Discourse, senza preoccuparsi della compatibilità retroattiva. Tuttavia, i siti che eseguono versioni precedenti di Discourse hanno ancora bisogno di una versione del tema/plugin che funzioni per loro.

Per colmare questo divario, è possibile istruire Discourse a verificare una versione ‘fissata’ (pinned) più vecchia del tema/plugin. Esistono due meccanismi per questo, controllati in ordine:

  1. Rami git d-compat/<AAAA>.<M> nel repository del tema/plugin (il metodo principale — raccomandato per tutte le nuove fissazioni).
  2. Un file YAML .discourse-compatibility nella radice del repository (il meccanismo originale, ancora supportato come fallback).

Se entrambi esistono, il ramo ha la precedenza.

:herb: Il sistema di rami d-compat/<AAAA>.<M>

Le release di Discourse utilizzano versioni basate sulla data, come 2025.5, 2025.6, ecc. Quando Discourse aggiorna un plugin o un tema da git, chiede al repository: “Hai un ramo chiamato d-compat/<AAAA>.<M> che corrisponde alla mia versione?” (ad esempio, d-compat/2025.5 per Discourse 2025.5.x). Se è così, Discourse esegue il checkout della punta di quel ramo invece di main.

La ricerca viene eseguita solo quando il checkout locale è sul ramo predefinito del repository. Se hai intenzionalmente fissato un altro ramo, la logica d-compat viene saltata e la tua fissazione viene rispettata.

Per supportare una versione più vecchia di Discourse con questo sistema:

  1. Crea un ramo chiamato d-compat/<AAAA>.<M> da un commit noto per funzionare su quella versione (ad esempio, git checkout -b d-compat/2025.5 <commit>).
  2. Spingilo su origin. Potresti voler proteggere il ramo dalla cancellazione accidentale.
  3. Applica eventuali commit di backport a quel ramo. Le istanze di Discourse su 2025.5.x li raccoglieranno automaticamente al prossimo aggiornamento; le istanze su versioni più recenti di Discourse continueranno a seguire il ramo predefinito.

Quando si utilizzano i rami, non è necessario toccare .discourse-compatibility.

:gear: Creazione automatizzata dei rami (create-d-compat-branch.yml)

In pratica, raramente è necessario creare questi rami a mano. Gli scheletri predefiniti per temi e plugin includono un workflow d-compat-branch.yml che viene eseguito quotidianamente, verifica le nuove versioni di Discourse core e spinge i rami d-compat/<AAAA>.<M> corrispondenti quando necessario.

Se il tuo repository è stato creato da una copia più vecchia degli scheletri, copia semplicemente il file d-compat-branch.yml nella directory .github/workflows per attivarlo.

:git_merged: Backport di una correzione a un ramo d-compat

Quando hai applicato una correzione sul ramo predefinito che deve anche raggiungere i siti su una release più vecchia di Discourse:

  1. Crea un ramo dal ramo d-compat di destinazione e cherry-pick la correzione:

    git fetch origin
    git checkout -b backport/my-fix-2025.5 origin/d-compat/2025.5
    git cherry-pick <commit-sha>
    git push -u origin backport/my-fix-2025.5
    
  2. Apri una PR con d-compat/2025.5 come ramo di base (non main). Ottienine la revisione e la fusione allo stesso modo in cui faresti per qualsiasi altra PR.

  3. Ripeti per ogni ramo d-compat/<AAAA>.<M> più vecchio che necessita della correzione.

I siti su 2025.5.x raccoglieranno il commit fuso al loro prossimo aggiornamento.

Fallback legacy: il file `.discourse-compatibility`

Se non esiste un ramo d-compat corrispondente, Discourse fa riferimento a un file YAML .discourse-compatibility nella radice del repository, che mappa le versioni di Discourse ai riferimenti git del tuo plugin/tema:

< 3.2.0.beta2-dev: abcde

Discourse seleziona la voce più bassa che corrisponde alla versione core in esecuzione, quindi chiunque sia su < 3.2.0.beta2-dev eseguirà il checkout del commit abcde. Usa < (o il legacy <=, il valore predefinito quando non viene specificato un operatore) per specificare il limite di versione. Ricorri a questo solo se il sistema basato su rami non può esprimere ciò di cui hai bisogno.


Questo documento è sotto controllo di versione - suggerisci modifiche su github.

17 Mi Piace

Se la versione è \u003c 3.5.0.beta8-dev, includerebbe 3.5.0?

No. 3.5.0 è considerato “superiore” alla versione prerelease “3.5.0.beta8-dev”.

Puoi sempre provare i confronti su una console ruby:

> Gem::Version.new("3.5.0") < Gem::Version.new("3.5.0.beta8-dev")
=> false
5 Mi Piace

Capito. Grazie per la spiegazione!

1 Mi Piace

Questo documento è stato aggiornato per descrivere la nuova strategia d-compat/* da RFC: A new versioning strategy for Discourse, ora disponibile per l’uso.

5 Mi Piace

La strategia d-compat/<YYYY>.<M> richiederebbe un branch per ogni rilascio specifico, giusto? Non è possibile definire un intervallo come con la costruzione .discourse-compatibility.

Quindi, se mantengo un plugin compatibile dall’ESR all’ultima versione, quando sposto gli sviluppi verso il nuovo ESR (che si sovrappone al vecchio ESR), dovrei creare branch per ciascuna versione intermedia?

Ad esempio, al momento l’ESR è 2026.1, la versione rilasciata è 2026.6 e l’ultima è 2026.7, ancora supportata nella 2026.5. Quando sposto il mio plugin sul nuovo ESR (2026.7), mentre il vecchio ESR è ancora supportato da Discourse, dovrei creare i branch:

  • d-compat/2026.1
  • d-compat/2026.2
  • d-compat/2026.3
  • d-compat/2026.4
  • d-compat/2026.5
  • d-compat/2026.6

Dove le versioni da .2 a .5 (incluse) sono fuori supporto (EOL) da parte di Discourse, ma gli utenti potrebbero ancora utilizzarle.

Oppure Discorse trova il branch più adatto se manca uno specifico, invece di assumere il branch principale?

Ad esempio, se sto eseguendo la versione 2026.5 e gli unici branch disponibili sono d-compat/2026.1 e d-compat/2026.6, quale branch verrebbe utilizzato?

  1. d-compat/2026.1, che è la versione compatibile più vicina?
  2. main, poiché non esiste un branch specifico?
1 Mi Piace

Sì, è necessario un ramo per ogni versione del core di Discourse. Consigliamo di automatizzarne la creazione:

Verrebbe utilizzato main.

2 Mi Piace