2011-12-02 32 views
7

Attualmente sto cercando di implementare i range di versioni OSGI (per un argomento diverso, ma mi piace il modo in cui definiscono gli intervalli di versione). Tuttavia ho difficoltà a trovare la definizione specifica di un intervallo di versione in OSGI.Intervalli di versione valida OSGI

Sfortunatamente, l'API OSGI contiene una classe Version ma non una classe VersionRange. Sembra che tutti i contenitori OSGI escano con la loro interpretazione della definizione del Range di versione (in qualche modo non suscettibile).

Quindi ho alcune domande:

  • Se ho usato versionRange=1.4.0, sarebbe questo mappa per la versione> = 1.4.0?
  • È un intervallo di versione valido: versionRange=[1.0.0,0]: Direi sì (versione 1.0.0 a qualsiasi versione), l'implementazione Eclipse lo accetta come versione ma non lo gestisce correttamente.
    • Questa versione potrebbe essere valida anche per: versionRange=[1.0.0,0)?
  • Dove è la vera fonte della verità per tutte quelle domande? Mi sembra di non riuscire a trovarlo.

risposta

6

Gli intervalli di versione sono definiti con precisione nella sezione 3.2.6 delle specifiche OSGi Core. Hai ragione che non esiste una classe VersionRange nell'API corrente, anche se ci sarà nella prossima versione di specifica.

Implementazioni di framework OSGi non fornire una propria interpretazione di intervalli; se trovi un caso in cui un framework specifico interpreta un intervallo in modo diverso dalla sezione 3.2.6 della specifica principale, si prega di sollevare un bug contro tale framework.

per rispondere alle vostre domande specifiche:

  • Sì, version=1.4.0 su un Import-Package (o bundle-version=1.4.0 su un Require-Bundle) fa Mappa informalmente alla "versione> = 1.4.0".

  • Credo che entrambi questi intervalli di versione siano validi, MA non corrisponderanno mai a nessuna versione. Per esempio. il primo esempio corrisponderà solo alla versione x dove x >= 1.0.0ex<=0. Non esiste alcun valore di x che possa soddisfare entrambi questi requisiti. Quindi sembra che Eclipse si comporti correttamente ... dovrebbe analizzare correttamente la stringa della gamma, ma non restituire mai risultati.

  • Come già accennato, la "fonte della verità" è la sezione 3.2.6 della specifica OSGi Core .... pagina 29 se stai leggendo la versione R4.3 del documento.

1

1) versionRange = 1.4.0 è equivalente a [1.4.0, l'infinito)

2) direi che non è valida, dal momento che il pavimento deve essere inferiore al massimale.

3) La prossima specifica OSGi definirà una classe VersionRange, credo.

4

Quindi, per rispondere alle vostre domande concrete:

  • Se ho usato versionRange = 1.4.0, sarebbe questo mappa per la versione> = 1.4.0?

Sì. Questo è esattamente il modo in cui le specifiche dicono che dovrebbe essere interpretato (vedi sotto).

  • È questo un intervallo versione valida: versionRange = [1.0.0,0]

Sì, è un intervallo valido, ma non valuterà a quello che ti sembra di essere in attesa. Valuta in modo efficace un insieme vuoto di versioni, quindi nessuna versione corrisponderà a questa espressione.

  • Questo sarebbe un versionRange valida Aswell: versionRange = [1.0.0,0)?

Come sopra - si tratta di una gamma versione valida, ma si valuterà a un insieme vuoto.

  • Dov'è la vera fonte della verità per tutte quelle domande? Mi sembra di essere in grado di trovare

Le specifiche sono disponibili su OSGi Alliance's home page da: http://www.osgi.org/Release4/Download (per R4 spec)

Di seguito è riportato un estratto dalla specifica nucleo OSGi R4 che copre il intervalli di versioni:

Versione gamme

A la gamma di versioni descrive una gamma di versioni che utilizzano una notazione a intervalli matematici. Vedi [31] Convenzione matematica per la notazione a intervalli.

La sintassi di un intervallo versione è:

version-range ::= interval | atleast 
    interval ::= ('[' | '(') floor ',' ceiling (']' | ')') 
    atleast ::= version 
    floor ::= version 
    ceiling ::= version 

Se un intervallo versione viene specificato come un'unica versione, deve essere interpretato come intervallo [version,). Il valore predefinito per un intervallo di versione non specificato è 0, che corrisponde a [0.0.0,).

Si noti che l'uso di una virgola nell'intervallo di versione richiede che sia racchiuso tra virgolette. Ad esempio:

Import-Package: com.acme.foo;version="[1.23, 2)", 
    com.acme.bar;version="[4.0, 5.0)" 

Nella tabella che segue, per ciascun intervallo specificato nella colonna di sinistra, una versione x è considerato un membro della gamma se il predicato nella destra la colonna è vera

[1.2.3, 4.5.6) | 1.2.3 <= x < 4.5.6 
[1.2.3, 4.5.6] | 1.2.3 <= x <= 4.5.6 
(1.2.3, 4.5.6) | 1.2.3 < x < 4.5.6 
(1.2.3, 4.5.6] | 1.2.3 < x <= 4.5.6 
1.2.3   | 1.2.3 <= x