Reputation: 5902
I have the following:
class compass {
package { 'ruby-dev':
ensure => installed,
}
package { ["rubygems"]:
ensure => 'installed'
}
package { ['sass']:
ensure => '3.2.0.alpha.277',
provider => 'gem',
require => Package['rubygems']
}~>
package { ['compass']:
ensure => '0.12.2',
provider => 'gem',
require => Package['rubygems']
}
}
When I do gem list
after it has run, two versions of sass
has been installed:
# gem list
*** LOCAL GEMS ***
chunky_png (1.2.8)
compass (0.12.2)
ffi (1.9.0)
fssm (0.2.10)
listen (1.1.6)
rake (10.1.0)
rb-fsevent (0.9.3)
rb-inotify (0.9.0)
rb-kqueue (0.2.0)
sass (3.3.0.alpha.212, 3.2.0.alpha.277)
zurb-foundation (3.0.6)
In order for my code to run, only 3.2.0.alpha.277
should be installed. It seems that the requirement from the sass
package is fulfilled, but that the compass
package requires sass "~> 3.1".
How do I make sure that only the 3.2.0.alpha.277
version of sass is installed?
Upvotes: 4
Views: 4751
Reputation: 1676
Interestingly I ran this on a pretty much clean slate of Ubuntu 12.04 and it only installed the 277 version.
Also I don't think that the package resource can do this for you. You could handle it in an exec though, like:
exec { 'remove-sass-3.3.0.alpha.212':
command => 'gem uninstall sass -v=3.3.0.alpha.212',
unless => 'test `gem list --local | grep -q 3.3.0.alpha.212; echo $?` -ne 0',
path => ['/usr/bin', '/bin'],
}
You could even wrap it up as a defined type:
define remove-gem ($version) {
exec { "remove-gem-${name}-version-${version}":
command => "gem uninstall ${name} -v=${version}",
unless => "test `gem list --local | grep -q \"${name}.*${version}\"; echo $?` -ne 0",
path => ['/usr/bin', '/bin'],
}
}
remove-gem {'sass':
version => '3.3.0.alpha.212',
}
that way you can reuse it to remove other particular gem versions.
Upvotes: 4