Class: Vagrant::Command::Base
- Inherits:
-
Thor::Group
- Object
- Thor::Group
- Vagrant::Command::Base
- Includes:
- Thor::Actions, Helpers
- Defined in:
- lib/vagrant/command/base.rb
Overview
A Base is the superclass for all commands which are single
commands, e.g. vagrant init
, vagrant up
. Not commands like
vagrant box add
. For commands which have more subcommands, use
a GroupBase.
A Base is a subclass of Thor::Group
, so view the documentation
there on how to add arguments, descriptions etc. The important note
about this is that when invoked, all public methods will be called
in the order they are defined. If you don't want a method called when
the command is invoked, it must be made protected
or private
.
The best way to get examples of how to create your own command is to
view the various Vagrant commands, which are relatively simple, and
can be found in the Vagrant source tree at lib/vagrant/command/
.
Defining a New Command
To define a new single command, create a new class which inherits
from this class, then call Base.register to register the command. That's
it! When the command is invoked, all public methods will be called.
Below is an example SayHello
class:
class SayHello < Vagrant::Command::Base
register "hello", "Says hello"
def hello
env.ui.info "Hello"
end
end
In this case, the above class is invokable via vagrant hello
. To give
this a try, just copy and paste the above into a Vagrantfile somewhere.
The command will be available for that project!
Also note that the above example uses env.ui
to output. It is recommended
you use this instead of raw "puts" since it is configurable and provides
additional functionality, such as colors and asking for user input. See
the UI class for more information.
Defining Command-line Options
Most command line actions won't be as simple as vagrant hello
, and will
probably require parameters or switches. Luckily, Thor makes adding these
easy:
class SayHello < Vagrant::Command::Base
register "hello", "Says hello"
argument :name, :type => :string
def hello
env.ui.info "Hello, #{name}"
end
end
Then, the above can be invoked with vagrant hello Mitchell
which would
output "Hello, Mitchell." If instead you're looking for switches, such as
"--name Mitchell", then take a look at class_option
, an example of which
can be found in the PackageCommand.
Direct Known Subclasses
Instance Attribute Summary collapse
-
#env ⇒ Object
readonly
Returns the value of attribute env.
Class Method Summary collapse
-
.register(usage, description, opts = nil) ⇒ Object
Register the command with the main Vagrant CLI under the given name.
Instance Method Summary collapse
-
#initialize(*args) ⇒ Base
constructor
A new instance of Base.
Methods included from Helpers
#initialize_environment, #target_vms
Constructor Details
#initialize(*args) ⇒ Base
Returns a new instance of Base.
92 93 94 95 |
# File 'lib/vagrant/command/base.rb', line 92 def initialize(*args) super initialize_environment(*args) end |
Instance Attribute Details
#env ⇒ Object (readonly)
Returns the value of attribute env.
68 69 70 |
# File 'lib/vagrant/command/base.rb', line 68 def env @env end |
Class Method Details
.register(usage, description, opts = nil) ⇒ Object
Register the command with the main Vagrant CLI under the
given name. The name will be used for accessing it from the CLI,
so if you name it "lamp", then the command to invoke this
will be vagrant lamp
.
The description is used when the help is listed, and is meant to be a brief (one sentence) description of what the command does.
Some additional options may be passed in as the last parameter:
:alias
- If given as an array or string, these will be aliases for the same command. For example,vagrant version
is alsovagrant --version
andvagrant -v
87 88 89 90 |
# File 'lib/vagrant/command/base.rb', line 87 def self.register(usage, description, opts=nil) desc description CLI.register(self, extract_name_from_usage(usage), usage, desc, opts) end |