Necesitaba comparar las restricciones de la versión pesimista hace un tiempo, pero no quería depender de RubyGems para hacerlo, así que escribí una Versionclase simple que hace todo lo que necesito: shorts.jeffkreeftmeijer.com/2014/…
La Gem::Version...sintaxis me hizo pensar que necesitaría instalar una gema. Pero no fue necesario.
Guillaume
Nota: Esto me da un error sobre la variable indefinida 'Gem' en Ruby 1.x, pero funciona como se esperaba en Ruby 2.x. En mi caso, estaba comprobando que RUBY_VERSION no fuera Ruby 1.x (no 2.x), así que hice RUBY_VERSION.split ('.') [0] == "1" como lo hacen John Hyland y DigitalRoss.
@uliwitness no es Ruby 1.x vs 2.x; es 1.8.x frente a 1.9+. Ruby hasta 1.8.x no incluye rubygems por defecto; necesita un require 'rubygems'para obtener acceso al Gemespacio de nombres. Sin embargo, a partir de la versión 1.9, se incluye automáticamente.
Mark Reed
Esto también funcionó para comparar versiones comodín de NPM. +1
Las versiones más nuevas parecen requerir una cadena para el nombre. Una cadena vacía funciona bien, es decirGem::Dependency.new('', '~> 1.4.5').match?('', '1.4.6beta4')
Peter Wagenet
19
classVersion<Arraydef initialize s
super(s.split('.').map {|e| e.to_i })enddef< x
(self<=> x)<0enddef> x
(self<=> x)>0enddef== x
(self<=> x)==0endend
p [Version.new('1.2')<Version.new('1.2.1')]
p [Version.new('1.2')<Version.new('1.10.1')]
Al igual que algunas de las otras respuestas aquí, parece que está haciendo comparaciones de cadenas en lugar de numéricas, lo que causará problemas al comparar versiones como '0.10' y '0.4'.
John Hyland
7
Votado a favor por una solución concisa que no requiere la instalación de una gema.
JD.
2
Por lo que vale: vers = (1..3000000).map{|x| "0.0.#{x}"}; 'ok' puts Time.now; vers.map{|v| ComparableVersion.new(v) }.sort.first; puts Time.now # 24 seconds 2013-10-29 13:36:09 -0700 2013-10-29 13:36:33 -0700 => nil puts Time.now; vers.map{|v| Gem::Version.new(v) }.sort.first; puts Time.now # 41 seconds 2013-10-29 13:36:53 -0700 2013-10-29 13:37:34 -0700 Code blob lo está haciendo feo, pero básicamente, usar esto vs Gem :: Version es aproximadamente el doble de rápido.
Lo he visto, pero requiere que use 2 gemas para hacer algo realmente simple. Quiero usar eso como última opción.
user239895
8
"No reinventes la rueda". El hecho de que sea simple no significa que el programador no haya trabajado ni pensado en ello. Usa la gema, lee el código y aprende de él, ¡y pasa a cosas más grandes y mejores!
Trevoke
La gestión de dependencias y el mantenimiento de versiones es un problema difícil, probablemente mucho más difícil que la tarea de comparar 2 versiones. Estoy totalmente de acuerdo en que introducir 2 dependencias más debería ser un último recurso en este caso.
Array.class_eval {include Comparable} hará que todas las matrices respondan a <,>, etc. O, si solo desea hacer esto con ciertas matrices: a = [1, 2]; a.extend (Comparable)
Wayne Conrad
4
El problema que encontré con esta solución es que devuelve que "1.2.0" es más grande que "1.2"
Básicamente, convierte cada cadena de versión en una matriz de enteros y luego usa el operador de comparación de matriz . Puede dividir los pasos de los componentes para obtener algo un poco más fácil de seguir si esto va en el código que alguien necesitará mantener.
Version
clase simple que hace todo lo que necesito: shorts.jeffkreeftmeijer.com/2014/…Respuestas:
fuente
Gem::Version...
sintaxis me hizo pensar que necesitaría instalar una gema. Pero no fue necesario.Gem::Dependency.new(nil, '~> 1.4.5').match?(nil, '1.4.6beta4')
require 'rubygems'
para obtener acceso alGem
espacio de nombres. Sin embargo, a partir de la versión 1.9, se incluye automáticamente.Si necesita verificar las restricciones de versión pesimista , puede usar Gem :: Dependency de esta manera:
fuente
Gem::Dependency.new('', '~> 1.4.5').match?('', '1.4.6beta4')
fuente
vers = (1..3000000).map{|x| "0.0.#{x}"}; 'ok' puts Time.now; vers.map{|v| ComparableVersion.new(v) }.sort.first; puts Time.now # 24 seconds 2013-10-29 13:36:09 -0700 2013-10-29 13:36:33 -0700 => nil puts Time.now; vers.map{|v| Gem::Version.new(v) }.sort.first; puts Time.now # 41 seconds 2013-10-29 13:36:53 -0700 2013-10-29 13:37:34 -0700
Code blob lo está haciendo feo, pero básicamente, usar esto vs Gem :: Version es aproximadamente el doble de rápido.Puedes usar la
Versionomy
gema (disponible en github ):fuente
yo lo haría
Entonces puedes hacer
(y probablemente todas las demás comparaciones "habituales").... y si quieres una prueba
<
o>
, puedes hacer, por ejemplo,o hacer un envoltorio más funcional si así lo desea.
fuente
Gem::Version
es la forma más fácil de ir aquí:fuente
Si desea hacerlo a mano sin usar gemas, algo como lo siguiente debería funcionar, aunque tiene un aspecto un poco perverso.
Básicamente, convierte cada cadena de versión en una matriz de enteros y luego usa el operador de comparación de matriz . Puede dividir los pasos de los componentes para obtener algo un poco más fácil de seguir si esto va en el código que alguien necesitará mantener.
fuente
Tuve el mismo problema, quería un comparador de versiones sin gemas, se me ocurrió esto:
fuente