# 泛指令能力

泛指令是一个非常有趣的概念，在很多的命令行工具中是很少见的。

传统意义上，或者一般情况下，我们所看到的命令行工具是工具开发者，已经定义好了各种指令。但是在Serverless Devs Tool中，我们是将这份能力充分放开的。

在官方提供的`config`，`init`，`set`，`search`，`platform`指令之外，我们提供一种泛指令，即组件开发者定义的指令，实际上用法如下。

例如当我们有一个项目使用了`fc`组件：
```yaml
MyFunctionDemo:
  Component: fc
  Provider: alibaba
  Properties:
    Region: cn-hangzhou
    Service:
      Name: abc
      Description: 欢迎使用ServerlessTool
    Function:
      Name: serverless_demo
      Description: 这是一个Nodejs10的测试案例
      CodeUri: ./
      Handler: index.handler
      MemorySize: 512
      Runtime: nodejs10
```

此时，我们在项目目录下进行`s -h`我们可以看到，项目中增加了一个`MyFunctionDemo`的指令：

![](https://images.serverlessfans.com/s-tool/zh/s-command-help-1.jpg)

此时，当我们执行`s MyFunctionDemo -h`的时候，我们可以看到，我们这个项目下的一些方法：

![](https://images.serverlessfans.com/s-tool/zh/s-command-help-2.jpg)

此时，我们就可以执行对应指令，进行不同的操作了，例如`s MyFunctionDemo deploy`进行项目部署操作。

当然，除此之外，我们还可以直接进行`s deploy`。直接执行`s deploy`时，系统将会按照部署顺序挨个项目进行调用其组件的`deploy`方法。

例如在某个Yaml中，有3个项目：

```yaml
Project1:
  Component: a
  Provider: alibaba
  Properties: test

Project2:
  Component: b
  Provider: alibaba
  Properties: test

Project3:
  Component: c
  Provider: alibaba
  Properties: test
```

另外这三个项目对应的组件方法：

- Project1：使用了a组件，a组件有deploy方法
- Project2：使用了b组件，b组件没有deploy方法
- Project3：使用了c组件，c组件有deploy方法

如果我此时此刻，执行`s Project1 deploy`，系统只会执行Project1所以来的a组件的deploy方法。
如果我执行`s Project2 deploy`，由于b组件没有deploy方法，所以此时系统会报错。

当我要进行批量操作的时候，我可以直接执行`s deploy`，此时此刻，系统会：
1. 分析Project1，Project2，Project3的部署顺序
2. 部署Project1，因为a组件有deploy方法，所以不会报错，也不会警告；
3. 部署Project2，因为b组件没有deploy方法，所以会抛出警告信息，但是不会终止流程；
4. 部署Project3，因为c组件有deploy方法，所以不会报错，也不会警告；
5. 部署完成，输出所有的汇总信息；

由于Serverless Devs Tool是一个组件化的工具，我们相信每个组件都可能有着不同的方法，例如函数计算的组件，可能就有logs，invoke，deploy等方法，而静态网站的组件可能就会有deploy，remove，update等方法，所以我们将组件的指令透传到工具外部，可以让使用者一目了然，一方面可以给组件更大的灵活性，让开发者可以更加简单、轻松、自由地完成更多的能力，另一方面可以让使用者更加有针对性的使用某个功能，某个能力。