docs » cp.plugins
This is a simple plugin manager.
It has a few core functions:
This function will load all enabled plugins in the specified 'parent' folders. For example:
local plugins = require("cp.plugins")
plugins.init("~/Library/Application Support/CommandPost/Plugins")
This will load all plugins in the current user's Library/Application Support/CommandPost/Plugins
folder.
Once the plugins have been loaded, the module can be accessed by their ID via the getPluginModule(id)
function. It will return the module returned by the plugin's init
function. This can also be done via the default function for the library. Eg:
plugins("my.plugin.id").doSomething()
Plugins typically have two parts:
- The plugin table, which defines details about the plugin, and
- The module, or result, which could be anything, which is returned from the
init
function.
A plugin file should return a plugin
table that allows the plugin to be initialised. The table will look something like this:
local module = {}
local module.init(otherPlugin)
-- do stuff with otherPlugin here
end
local plugin = {
id = "my.plugin.id",
group = "foo",
dependencies = {
["some.other.plugin"] = "otherPlugin",
},
}
function plugin.init(dependencies)
-- do stuff to initialise the module here
module.init(dependencies.otherPlugin)
return module
}
function plugin.postInit(dependencies)
-- do stuff that will happen after all plugins have been initialised.
end
As you can see above, plugin module can have a few simple functions and properties. The key ones are:
This is a unique ID for the plugin. It is used to load the plugin externally, as well as to define dependencies between plugins.
This is the group ID for the plugin. This is used to group plugins visually in the Properties panel for Plugins.
This optional property can be specified for plugins which should never be disabled. This should only be set for plugins which will break the application if disabled.
This is a table with the list of other plugins that this plugin requires to be loaded prior to this plugin. Be careful of creating infinite loops of dependencies - we don't check for them currently!
It is defined like so:
plugin.dependencies = {
"cp.plugins.myplugin",
["cp.plugins.otherplugin"] = "otherPlugin"
}
As you can see, there are two ways of declaring a dependency. The first is with just the plugin ID, the second has an alias.
These can be accessed in the `init` and `postInit` functions like so:
```lua
function plugin.init(dependencies)
local myPlugin = dependencies["cp.plugins.myplugin"]
local otherPlugin = dependencies.otherPlugin -- or dependencies["cp.plugins.otherplugin"]
end
A plugin will only have its init
function called after its dependencies have successfully had their init
functions called. Additionally, if a plugin has a postInit
, all declared postInits
for dependencies will have been called prior to the plugin's postInit
function.
This function is basically required. It will be executed when the plugin is initialised. The dependencies
parameter is a table containing the list of dependencies that the plugin defined via the dependencies
property. The environment
provides access to resources such as images, HTML files, or other lua modules that are bundled with the plugin. See Simple vs Complex Plugins
below.
As you may have noted, there are two ways to specify a plugin is required. Either by simply specifying it as an 'array' item (the first example) or as a key/value (the second example). Doing the later allows you to specify an alias for the dependency, which can be used in the `init(...)` function, like so:
```lua
local plugin = {}
plugin.dependencies = {
"cp.plugins.myplugin",
["cp.plugins.otherplugin"] = "otherplugin"
}
function plugin.init(dependencies)
local myplugin = dependencies["cp.plugins.myplugin"]
local otherplugin = dependencies.otherplugin
-- do other stuff with the dependencies
return myinstance
end
return plugin
There are two types of plugin structures supported. The Simple version is a single .lua
file that matches the above format for plugin
. The Complex version is a folder containing an init.lua
file that matches the above format.
The key advantage of Complex Plugins is that the folder can contain other resources, such as images, HTML templates, or other .lua
files - including 3rd-party libraries if desired. These can be accessed via two main mechanisms:
- The second
environment
parameter in theinit
function. This is a cp.plugins.env table, which provides access to files and templates inside the plugin folder. See the documentation for details. - The standard
require
method will allow loading of*.lua
files inside the plugin from theinit.lua
.
For example, if you have a file called foo.lua
in your folder, it can be required
like so:
local foo = require("foo")
You do not have to know anything about where the plugin folder is stored, or use the plugin ID. Just use the local file path within the plugin. If you have another file in a foo
folder called bar.lua
, it can be loaded via:
local fooBar = require("foo.bar")
These modules will not be accessible to other plugins or to the main application. They are only available to code inside the plugin.
- Functions - API calls offered directly by the extension
- addDependent
- disable
- enable
- getDependents
- getPluginIds
- getPluginModule
- getPlugins
- init
- initPlugin
- initPlugins
- isDisabled
- loadComplexPlugin
- loadDependencies
- loadSimplePlugin
- postInitPlugin
- postInitPlugins
- scanDirectory
- watchPluginPaths
Signature | cp.plugins.addDependent(id) -> nothing |
---|---|
Type | Function |
Description | Adds the dependentPlugin as a dependent of the plugin with the specified id. |
Parameters |
|
Returns |
|
Signature | cp.plugins.disable(id) -> nothing |
---|---|
Type | Function |
Description | Disabled the plugin with the specified ID and reloads the application. |
Parameters |
|
Returns |
|
Signature | cp.plugins.enable(id) -> nothing |
---|---|
Type | Function |
Description | Enables the plugin with the specified ID, and reloads the application. |
Parameters |
|
Returns |
|
Signature | cp.plugins.getDependents(pluginId) |
---|---|
Type | Function |
Description | Retrieves the list of dependent plugins for the specified plugin id. |
Parameters |
|
Returns |
|
Signature | cp.plugins.getPluginIds() -> table |
---|---|
Type | Function |
Description | Retrieves an array of the loaded plugin IDs. |
Parameters |
|
Returns |
|
Signature | cp.plugins.getPluginModule(id) -> value |
---|---|
Type | Function |
Description | Returns an initialised plugin result with the specified id . |
Parameters |
|
Returns |
|
Signature | cp.plugins.getPlugins() -> table |
---|---|
Type | Function |
Description | Retrieves an array of details about the set of loaded plugins. |
Parameters |
|
Returns |
|
Signature | cp.plugins.init(paths) -> cp.plugins |
---|---|
Type | Function |
Description | Initialises the plugin loader to look in the specified file paths for plugins. |
Parameters |
|
Returns |
|
Signature | cp.plugins.initPlugin(id) -> module |
---|---|
Type | Function |
Description | Initialises a specific plugin with the specified path. |
Parameters |
|
Returns |
|
Signature | cp.plugins.initPlugins() -> nothing |
---|---|
Type | Function |
Description | Initialises all registered plugins. |
Parameters |
|
Returns |
|
Signature | cp.plugins.isDisabled(id) -> boolean |
---|---|
Type | Function |
Description | Checks if the specified plugin ID is disabled. |
Parameters |
|
Returns |
|
Signature | cp.plugins.loadComplexPlugin(path) -> plugin |
---|---|
Type | Function |
Description | Loads a 'complex' plugin, which is a folder containing an init.lua file. |
Parameters |
|
Returns |
|
Signature | cp.plugins.loadDependencies(plugin) -> table |
---|---|
Type | Function |
Description | Loads the list of dependencies for the provided plugin. |
Parameters |
|
Returns |
|
Signature | cp.plugins.loadSimplePlugin(id) -> plugin |
---|---|
Type | Function |
Description | Loads a 'simple' plugin, where it is defined by a single LUA script. |
Parameters |
|
Returns |
|
Signature | cp.plugins.postInitPlugin(id) -> boolean |
---|---|
Type | Function |
Description | Runs any post-initialisation functions declared for the specified plugin ID. |
Parameters |
|
Returns |
|
Signature | cp.plugins.postInitPlugins() -> nothing |
---|---|
Type | Function |
Description | Performs any post-initialisation required for plugins. |
Parameters |
|
Returns |
|
Signature | cp.plugins.scanDirectory(directoryPath) -> cp.plugins |
---|---|
Type | Function |
Description | Scans the specified directory and loads any plugins in the directory, |
Parameters |
|
Returns |
|
Signature | cp.plugins.watchPluginPaths() -> nothing |
---|---|
Type | Function |
Description | Watches the plugin paths for changes and reloads the application if any change. |
Parameters |
|
Returns |
|