2011-12-02 14 views
7

Actualmente estoy intentando implementar rangos de versión de OSGI (para un tema diferente, pero me gusta la forma en que definen los rangos de versión). Sin embargo, me está costando encontrar la definición específica de un rango de versiones en OSGI.Rangos de versión válida de OSGI

Desafortunadamente, la API de OSGI contiene una clase de versión pero no una clase de VersionRange. Parece que todos los contenedores OSGI presentan su propia interpretación de la definición del rango de versiones (algo indescifrable).

por lo tanto tengo varias preguntas:

  • Si usara versionRange=1.4.0, haría este mapa a la versión> = 1.4.0?
  • Este es un rango de versión válido: versionRange=[1.0.0,0]: Diría que sí (versión 1.0.0 hasta cualquier versión), la implementación de Eclipse lo acepta como una versión pero no lo maneja correctamente.
    • ¿Sería esta una versión válida del Rango también: versionRange=[1.0.0,0)?
  • ¿Dónde está la verdadera fuente de verdad para todas esas preguntas? Parece que no puedo encontrarlo.

Respuesta

6

Rangos de versión son definidos con precisión en la sección 3.2.6 de la especificación de OSGi Core. Tiene razón en que no existe la clase VersionRange en la API actual, aunque sí lo estará en la próxima versión de la especificación.

Implementaciones del marco OSGi do no vienen con su propia interpretación de rangos; si encuentra un caso en el que un marco específico interpreta un rango de manera diferente a la sección 3.2.6 de la Especificación básica, genere un error en ese marco.

para responder a sus preguntas específicas:

  • Sí, version=1.4.0 en una Import-Package (o bundle-version=1.4.0 en un Require-Bundle) hace un mapa de manera informal a "la versión> = 1.4.0".

  • Creo que estos dos rangos de versión son válidos, PERO nunca coincidirán con ninguna versión. P.ej. El primer ejemplo solo coincidirá con la versión x donde x >= 1.0.0yx<=0. No hay ningún valor de x que pueda satisfacer estos dos requisitos. Entonces parece que Eclipse se está comportando correctamente ... debería analizar con éxito la cadena de rango pero nunca devolverá ningún resultado.

  • Como ya se mencionó, la "fuente de la verdad" es la sección 3.2.6 de la especificación principal OSGi .... página 29 si está leyendo la versión R4.3 del documento.

1

1) versionRange = 1.4.0 es equivalente a [1.4.0, el infinito)

2) yo diría que no es válida, ya que el suelo debe ser inferior al límite máximo.

3) La próxima especificación OSGi definirá una clase VersionRange, creo.

4

Por lo tanto, para responder a sus preguntas concretas con el fin de:

  • Si usara versionRange = 1.4.0, haría este mapa a la versión> = 1.4.0?

Sí. Esta es exactamente la forma en que las especificaciones dicen que debe interpretarse (ver más abajo).

  • ¿Es esta una gama versión válida: versionRange = [1.0.0,0]

Sí, es un rango válido, pero no va a evaluar en qué pareces estar esperando. Efectivamente evalúa a un conjunto vacío de versiones, por lo que ninguna versión coincidirá con esta expresión.

  • ¿Sería ésta una versionRange válida Aswell: versionRange = [1.0.0,0)?

Igual que el anterior - se trata de una gama versión válida, pero se evaluará como un conjunto vacío.

  • ¿Dónde está la fuente real de la verdad para todas esas preguntas? Parece que soy incapaz de encontrarlo

Las especificaciones están disponibles en OSGi Alliance's página principal desde: http://www.osgi.org/Release4/Download (para R4 especificaciones)

A continuación se muestra un extracto de la especificación básica OSGi R4 que cubre el rangos de versión:

Versión rangos

A El rango de versión describe un rango de versiones usando una notación de intervalo matemático. Ver [31] Convención Matemática para la Notación por Intervalos.

La sintaxis de un intervalo de versiones es:

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

Si se especifica un intervalo de versiones como una sola versión, debe ser interpretada como la gama [version,). El valor predeterminado para un rango de versión no especificado es 0, que se asigna a [0.0.0,).

Tenga en cuenta que el uso de una coma en el rango de versión requiere que se incluya entre comillas dobles. Por ejemplo:

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

En la tabla siguiente, para cada rango especificado en la columna de la izquierda, una versión x se considera que es un miembro de la gama si el predicado en la mano derecha la columna es verdadera

[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 
Cuestiones relacionadas