# pmfp

+ version: 4.1.10
+ status: dev
+ author: hsz
+ email: hsz1273327@gmail.com

## Description

一个用于管理项目及相关开发的工具

keywords: tool,project_manager

## 特点

+ 可以独立使用功能模块
+ 根据模板快速构建项目
+ 简单的编译和打包指令
+ 快速测试
+ 文档维护,支持github page

## 注意

+ 要支持grpc或者protobuf需要安装相关依赖
  
    + 通用的编译工具:protoc
    + python: `grpcio`,`grpcio-tools`
    + node: `@grpc/proto-loader`,`async`,`google-protobuf`,`grpc`,`lodash`,`minimist`
  
## Install

`python -m pip install pmfp`

## 使用

pmfp现在被设计为两个部分:

1. `项目管理部分`用于快速根据托管在git仓库上的模板仓库项目构造项目
2. `调用功能部分`用于为不同的项目提供特定功能

### 项目管理

项目管理使用的子命令为`project`,其整体设计思路是这样:

1. 借助git仓库来保存组件模板.
2. 每个组件模板使用jinja2作为模板引擎,允许使用其模板语法
3. 用于保存组件模板的git仓库称为资源包(source pack)
4. 资源包需要使用一个文件来声明其中注册的组件和默认行为,默认这个文件为资源包根目录下的`.pmfp_template.json`文件.其具体schema可以查看项目的`protocol.py`文件中的`TEMPLATE_INFO_SCHEMA`对象定义
5. 如果资源包声明文件中`template_type`不为`components`则说明这是一个模板资源包,我们就可以根据其作为模板构造项目.
6. 资源包中每个组件都有一个`source`字段,这个字段用于声明组件的位置,如果其中有`//`则说明它是引用的另一个资源项目的组件
7. 根据模板包构造项目只要指定一个资源包路径即可,其形式为`[[{host}::]{repo_namespace}::]{repo_name}[@{tag}]`
8. 如果是已有项目要添加组件,则可以使用`[[{host}::]{repo_namespace}::]{repo_name}[@{tag}]//{component_path_str}`
9. 默认的host为`github.com`,默认的repo_namespace为`Project-Manager-With-Git`,默认的tag为`latest`,如果tag为latest它会拉取master分支的head.默认的资源仓库可以通过修改`~/.pmfprc/config.json`来修改,

另外我们还可以使用`cache`子命令管理资源包缓存

#### 资源仓库类型

本项目将所有资源仓库类型分为如下几种:

1. `socket`,专指基于网络的通讯程序,包括http服务,websocket客户端与服务,各种rpc客户端与服务,以及zeromq,webrtc等
2. `GUI`,专指图形界面
3. `task`专指主动执行的任务,比如一般脚本,定时任务
4. `watcher`监听器,被动监听事件的任务,比如监听文件系统的任务,监听消息中间件的任务
5. `module`模块,必须被其他程序调用的程序
6. `components`组件集合,本身并不能执行
7. `doc`文档型组件

#### 资源仓库版本标签

资源仓库的分支和tag名都可以作为版本标签,但有两个特殊标签会进行更新操作,其他标签一旦下载到本地就不会更新了.因此构造资源仓库时建议使用git的tag维护稳定版本模板.

两个特殊标签为:

+ `latest`会拉取master或者main分支.这个标签应该保证为最新的可用版本
+ `dev`会拉取dev分支,这个标签意为开发版本,并不需要保证是可用版本

#### 项目语言及对应的环境

本项目目前之前如下语言和执行环境组合:

+ language为`py`
    + env为`venv`,即python的标准库venv生成的c python虚拟环境
    + env为`conda`,即anaconda/miniconda生成的c python虚拟环境
    + env为`pypy`,即python的标准库venv生成的pypy虚拟环境

+ language为`js`
    + env为`node`,即以node为执行环境的javascript的babel标准环境
    + env为`webpack`,即以浏览器为执行环境,使用webpack编译项目的javascript的babel标准环境

+ language为`cython`
    + env为`venv`,即python的标准库venv生成的c python虚拟环境
    + env为`conda`,即anaconda/miniconda生成的c python虚拟环境

+ language为`go`
    + env为`gomod`,即golang的gomod模式管理项目

+ language为`C`
    + env为`cmake`,即使用cmake作为c语言的项目管理工具

+ language为`CXX`
    + env为`cmake`,即使用cmake作为c语言的项目管理工具

+ language为`md`
    + env为`http`,即使用markdown作为目标语言托管到http服务器上的纯文档环境

### 直接调用功能

支持直接调用功能的子命令包括:

+ `build`打包项目到可分发状态.
+ `doc`快速构造项目的文档
+ `docker image`快速构造docker镜像
+ `docker compose`快速构造docker部署配置
+ `env`快速构建项目的独立执行环境
+ `grpc`快速构造了grpc的客户端和服务端
+ `http`用于构造静态http服务和构造http请求和压测
+ `proto`用于快速构建和编译protobuf文件
+ `schema`用于校验`jsonschema`
+ `test`用于对项目进行测试
+ `requires`用于管理依赖

#### `build`打包项目到可分发状态

这条命令的含义为--打包项目到可以分发的状态.不同编程语言可以打包到的状态并不相同:

+ golang:

    + `exec`可执行文件
    + `alib`静态库
    + `dlib`动态库(linux专用)
    + `zip`源码压缩归档

+ python:
    + `exec`,可执行的`.pyz`文件
    + `zip`,wheel归档