# 如何编写自已的命令

Uliweb内置了一个命令系统,其中在uliweb/manage.py中已经内置了一些常用命令。同时 你也可以在某个app中,按照命令编写的要求来编写app相关的命令。这样一旦在settings.ini 中的 INSTALLED_APPS 里引入了这个app,这些命令就可以被 Uliweb 使用。你可以 输入 uliweb 来查看当前有哪些可用的命令。

下面就来介绍一下如何编写自已的命令。

## 创建commands.py文件

在你的app下创建一个commands.py的文件,文件结构如下:

``` from uliweb.core.commands import Command from optparse import make_option

class DemoCommand(Command):

name = ‘demo’ option_list = (

make_option(‘-d’, ‘–demo’, dest=’demo’, default=False, action=’store_true’,
help=’Demo command demo.’),

) help = ‘’ args = ‘’ check_apps_dirs = True has_options = False check_apps = False

def handle(self, options, global_options, *args):
print ‘This is a demo of DemoCommand, you can enter: ‘ print print ‘ uliweb help demo’ print print ‘to test this command’ print print ‘options=’, options print ‘global_options=’, global_options print ‘args=’, args

```

以上是一个命令的示例,仔细解释一下。

## 命令类

### 类属性

每个命令都应该从Command类派生而来。这个类有几个属性可以覆盖,分别为:

name –

命令的名字。你将使用它来执行,执行方式如:

` uliweb demo `

option_list –
它是参数列表。定义形式为 optparse 所要求的格式。每个参数都使用 make_option 来定义。它支持短参数和长参数。其中短参数就是类似 -d ,长参数就是 –demodest 表示解析后的参数将使用的变量名。 default 为缺省值。 action 表示解析后的值如何存储,这里为 store_true ,表示一旦给出参数,则将保存为 True 。所以,这种方式会将参数解析为 Boolean 值。那么如果要解析为字符 串怎么做,只要去掉 action 即可,缺省就是字符串,这样可以在参数后面接收 参数。 help 为此参数的帮助信息。
help –
它会额外输出当前命令的帮助信息。用于对当前命令进行解释。
args –

将用在帮助信息的显示上。它与下面的 has_options 一起用在帮助信息的显示上。 对命令的执行没有影响。如果定义 has_optionsTrue ,则命令帮助显示 为:

` uliweb demo [options] <args> `

如果为 False ,则命令显示为:

` uliweb demo <args> `

has_options –
用于帮助信息的显示。
check_apps_dirs –
用来显示是否检查当前目录下存在 apps 子目录。缺省为 True
check_apps –
用来检查app是否存在。如果设置为 True ,则假定传入的参数应该是 app 。这里 的参数是进行过命令行参数解析之后剩下的参数。

### 类方法

def get_apps(self, global_options, include_apps=None) –
返回当前项目所有app的清单。类似于uliweb中的get_apps,不过它因为使用了global_options 所以使用会更为简单
def get_application(self, global_options) –
根据配置信息创建一个application的实例,它会调用 make_simple_application
def handle(self, options, global_options, *args) –
用于子类继承的方法。用户自定义的命令应该覆盖这个方法。

## handler方法

handler方法是命令类的主体,它接三个参数:

options –
为本命令专有的参数,它是与类中的 option_list 的定义相对应的。
global_options –
为命令全局参数。Uliweb的命令系统提供了缺省的全局参数,如 -h , -v 等 参数。因此用户在定义自已的命令参数时,注意不要与全局的参数重复。
args –
它就是参数解析之后剩下的参数。

## 常用在命令中的uliweb方法

extract_dirs –

从指定的模块的子目录下抽取相应的目录和文件到指定目录下。

` from uliweb.utils.common import extract_dirs `

函数定义为:

` extract_dirs(module, path, dest_path, options) `

module –
模块名。
path –
模块下的目录路径。
dest_path –
目标目录。
options –
可使用参数。如:

` verbose=global_options.verbose `

get_apps –

获得当前项目下所有的app名字

` from uliweb import get_apps `

函数定义为:

` get_apps(apps_dir, settings_file, local_settings_file) `

apps_dir –
当前项目下的apps目录。使用时如:

` global_options.apps_dir `

settings_file –
settings.ini文件路径。使用时如:

` global_options.settings `

local_settings_file –
local_settings.ini文件路径,使用时如:

` global_options.local_settings `

## 常用global_options属性

verbose –
对应于 -v 参数。表示是否要冗余输出。
apps_dir –
项目下的 apps 子目录。
project –
项目目录。
settings –
当前项目的settings.ini文件。用户可以使用非settings.ini名字。
local_settings –
当前项目下的local_settings.ini文件。用户可以使用非local_settings.ini名字。

## Command类

Command 类是所有命令的基类。大多数方法请参见 uliweb/core/commands.py 文件。 其中有 get_apps 方法,功能和uliweb中的一样,不过需要传入的参数不同,如:

get_apps –

` get_apps(global_options, include_apps=None) `

使用起来比uliweb下的get_apps要简单一些。

get_application –

` get_application(global_options) `

获得当前应用的实例,它将完成整个应用的初始化工作

## 模块方法

get_answer(message, answers=’Yn’, default=’Y’, quit=’n’) –

从命令行获得一个应答。

message –
提示信息
answers –
为待提受的可选字符集合
default –
为输入回车时的缺省值
quit –
为退出输入字符

示例:

` ans = get_answer(message, answers='Yn', quit='q') `

get_input(prompt, default=None, choices=None, option_value=None) –

判断命令行参数值是否存在,如果不存在则在命令行提示用户输入

prompt –
提示信息
default –
按回车时的缺省值
choices –
可选输入值的范围
option_value –
命令输入的可选项,如果不为None,则会直接返回

示例:

``` get_input(prompt, default=url_prefix, option_value=options.url) get_input(“Creation Theme([a]ngularjs):”, default=”a”, choices=[‘a’],

option_value=options.theme)

```