|  | # Glide Plugins | 
|  |  | 
|  | (Not to be confused with Glade Plugins. Pew.) | 
|  |  | 
|  | Glide supports a simple plugin system similar to Git. When Glide | 
|  | encounters a subcommand that it does not know, it will try to delegate | 
|  | it to another executable according to the following rules. | 
|  |  | 
|  | Example: | 
|  |  | 
|  | ``` | 
|  | $ glide in     # We know this command, so we execute it | 
|  | $ glide foo    # We don't know this command, so we look for a suitable | 
|  | # plugin. | 
|  | ``` | 
|  |  | 
|  | In the example above, when glide receives the command `foo`, which it | 
|  | does not know, it will do the following: | 
|  |  | 
|  | 1. Transform the name from `foo` to `glide-foo` | 
|  | 2. Look on the system `$PATH` for `glide-foo`. If it finds a program by | 
|  | that name, execute it... | 
|  | 3. Or else, look at the current project's root for `glide-foo`. (That | 
|  | is, look in the same directory as glide.yaml). If found, execute it. | 
|  | 4. If no suitable command is found, exit with an error. | 
|  |  | 
|  | ## Writing a Glide Plugin | 
|  |  | 
|  | A Glide plugin can be written in any language you wish, provided that it | 
|  | can be executed from the command line as a subprocess of Glide. The | 
|  | example included with Glide is a simple Bash script. We could just as | 
|  | easily write Go, Python, Perl, or even Java code (with a wrapper) to | 
|  | execute. | 
|  |  | 
|  | A glide plugin must be in one of two locations: | 
|  |  | 
|  | 1. Somewhere on the PATH (including `$GLIDE_PATH/_vendor/bin`) | 
|  | 2. In the same directory as `glide.yaml` | 
|  |  | 
|  | It is recommended that system-wide Glide plugins go in `/usr/local/bin` | 
|  | while project-specific plugins go in the same directory as `glide.yaml`. | 
|  |  | 
|  | ### Arguments and Flags | 
|  |  | 
|  | Say Glide is executed like this: | 
|  |  | 
|  | ``` | 
|  | $ glide foo -name=Matt myfile.txt | 
|  | ``` | 
|  |  | 
|  | Glide will interpret this as a request to execute `glide-foo` with the | 
|  | arguments `-name=Matt myfile.txt`. It will not attempt to interpret | 
|  | those arguments or modify them in any way. | 
|  |  | 
|  | Hypothetically, if Glide had a `-x` flag of its own, you could call | 
|  | this: | 
|  |  | 
|  | ``` | 
|  | $ glide -x foo -name=Matt myfile.txt | 
|  | ``` | 
|  |  | 
|  | In this case, glide would interpret and swollow the -x and pass the rest | 
|  | on to glide-foo as in the example above. | 
|  |  | 
|  | ### Environment Variables | 
|  |  | 
|  | When Glide executes a plugin, it passes through all of its environment | 
|  | variables, including... | 
|  |  | 
|  | - GOPATH: Gopath | 
|  | - PATH: Executable paths | 
|  | - GLIDE_GOPATH: Gopath (in case GOPATH gets overridden by another | 
|  | script) | 
|  | - GLIDE_PROJECT: The path to the project | 
|  | - GLIDE_YAML: The path to the project's YAML | 
|  | - ALREADY_GLIDING: 1 if we are in a `glide in` session. | 
|  |  | 
|  | ## Example Plugin | 
|  |  | 
|  | File: glide-foo | 
|  |  | 
|  | ```bash | 
|  | #!/bin/bash | 
|  |  | 
|  | echo "Hello" | 
|  | ``` | 
|  |  | 
|  | Yup, that's it. Also see `glide-example-plugin` for a bigger example. |