## 工程目录结构

通过bucky命令行工具创建工程目录，可以比较清晰的组织工程的目录结构。例如通过下面的步骤，可以创建一个清晰的服务端、前端工程目录结构。

0. `mkdir test`
1. `cd test`
2. `bucky init -i` 进入交互式初始化模式
3. 创建项目，输入项目相对路径：`src/server`，项目类型选择`Bucky项目`的序号
    - 并分别创建名为`account`和`setting`两个新的`新建package`
    - 继续创建一个名为`common`的`静态库`
    - 选择不继续创建包
4. 继续创建项目，输入项目相对路径:`src/client/react_native_ui`，项目类型选择`ReactNative（前端）`的序号
5. 继续创建项目，输入项目相对路径:`src/client/html`，项目类型选择`HTML5（前端）`的序号
6. 继续创建项目，输入项目相对路径:`src/client/node_cli`，项目类型选择`Node（命令行程序）`的序号
7. 选择不继续创建项目
8. 完成

此时，目录结构如下（显示了4层）：
```
.
├── dist
│   ├── bucky
│   ├── h5
│   └── wx
├── knowledges.json
├── solution.json
├── src
│   ├── client
│   │   ├── html5
│   │   │   ├── core
│   │   │   ├── css
│   │   │   ├── img
│   │   │   ├── index.html
│   │   │   └── main.js
│   │   ├── node_cli
│   │   │   ├── core
│   │   │   └── main.js
│   │   └── react_native_ui
│   │       ├── App.js
│   │       ├── android
│   │       ├── app.json
│   │       ├── core
│   │       ├── index.js
│   │       ├── ios
│   │       ├── node_modules
│   │       ├── package-lock.json
│   │       ├── package.json
│   │       ├── shim.js
│   │       └── yarn.lock
│   └── server
│       ├── account
│       │   ├── account.js
│       │   ├── config.json
│       │   └── onload.js
│       ├── common
│       │   ├── common.js
│       │   ├── config.lib.json
│       │   └── onload.js
│       └── setting
│           ├── config.json
│           ├── onload.js
│           └── setting.js
└── test
    ├── account
    ├── common
    └── setting
```

可以看到，工程目录结构下主要包含如下几个关键要素：

#### 解决方案配置文件
- `solution.json` 表示整个解决方案，该文件里包含了对目录下所有子`project`的配置信息，以及`bucky`相关的重要配置。用户日常会修改的有：
    - `solution.json`里面的`meta/locale`字段，用来配置代码会在bucky的哪个集群上运行，目前有`china`,`us`两个可选集群。

#### 全局配置文件
- `knowledges.json` 里面主要是App的全局Konwledges配置，主要在使用`MySQL`,`MongoDB`,`OSS存储`,`系统事件`的时候需要进行对应的配置

#### bucky项目目录结构
- `src/server`，是刚刚创建的`Bucky项目`，里面包含了一个一个`XAR Package`，每个`XAR Package`下含有：
    - `config.json`，代表这是一个`XAR Package`
    - `config.lib.json`，代表这是一个公用的`静态库`，其他`XAR Package`里可以直接使用相对路径require`静态库`里面的js模块，这对编写多个`XAR Package`的公共类库是十分有用的。
    - 注意Bucky项目下，一个包要么是`XAR Package`，要么是`静态库`，不可以混淆。
    - `onload.js`，是一个`XAR Package`加载时会被执行的受限代码
    - 其他js文件，代表`XAR Package`内的模块，模块的导出配置在`config.json`/`modules`字段下。
- 注意到与`solution.json`同级还有一个`test/xxx`目录，这几个目录是在每次创建一个新的bucky `XAR Package`的时候，自动创建的对应包的测试目录

在对应包的对应测试目录下编写测试代码是bucky推荐的做法。例如通过本地调试可以快速排错：
1. 在`test/account`目录下添加`test/account/test_account.js`
2. 本地调试：`bucky debug -main test/account/test_account.js`

#### 前端项目目录结构
- `src/client/react_native_ui`，是新创建的react-native前端项目代码，其中`src/client/react_native_ui/core`目录下会在bucky编译的时候，自动同步下面三个文件：
    - `rn_core.js`
    - `rn_ld_core.js`
    - `bucky_meta.js`
    - 上述三个文件都是在`src/client/react_native_ui/App.js`里面使用bucky必须的。
- `src/client/html5`，是新创建的html5前端项目代码，其中`src/client/html5/core`目录下会在bucky编译的时候，自动同步下面三个文件：
    - `h5_core.js`
    - `h5_ld_core.js`
    - `bucky_meta.js`
    - 上述三个文件都是在`src/client/html5/main.js`里面使用bucky必须的。
- `src/client/node_cli`，是新创建的node命令行程序，其中`src/client/node_cli/core`目录下会在bucky编译的时候，自动同步下面三个文件：
    - `node_core.js`
    - `node_ld_core.js`
    - `bucky_meta.js`
    - 上述三个文件都是在`src/client/node_cli/main.js`里面使用bucky必须的。

可以看到，前端项目的目录下通常都有一个`core`目录，bucky会在执行`bucky build`的过程中，自动同步这些文件。

其中`bucky build`实际包含了下面2个个动作：
1. `bucky compile`: 编译解决方案，执行的动作如下：
    - 编译Bucky类型项目下的`XAR Package`，输出目录是`dist/bucky/`
    - 编译`konwledges.json`, 生成`dist/bucky/knowledges.json`
    - 生成`bucky_meta.json`，生成`dist/bucky/bucky_meta.json`
    - 同步不同前端项目的core目录，开发者可以在`solution.json`里对应`project`配置里修改`core_dir`的相对路径。
2. `bucky proxy`: 代理生成步骤，执行的动作如下：
    - 为`dist/bucky/`下的`XAR Package`生成代理包
    - 计算`dist/bucky/`下所有`XAR Package`（包含代理包）的带哈希版本集信息，生成`dist/bucky/version_set.json`
    - 版本集的设置，为开发者做灰度测试提供了便利，可参考版本集相关的文档
  
其中`bucky deploy`实际包含了如下3个部署动作
1. `bucky pub`：把`XAR Package`发布到bucky的包仓库上(bucky repository)上
2. `bucky stop`: 在bucky cloud上停止该app，该步骤可能会耗时，取决于app正在运行中的云端runtime的数量
3. `bucky start`：在bucky cloud上启动该app


## 小结

到此，可以清晰的看到使用bucky 命令行工具创建工程目录，具有`solution`、`project`两层清晰的结构，而`knowledges.json`则作为全局配置存在。

并且，`project`里又分为`Bucky项目`、`react-native前端项目`、`html5前端项目`、`node命令行程序`等。客户端项目和bucky之间通过这些项目的core目录下的bucky类库连接在一起。

单独说明的是`Bucky项目`，包含了`XAR Pacakage`子结构，用来模块化在bucky cloud上被自动调度的代码包，同时它们的输出目录默认位于`dist/bucky`下。

通过理解bucky的工程目录结构，开发者可以更清晰的组织、管理项目。
