c13_04.md 7.3 KB
Newer Older
写代码的明哥's avatar
update  
写代码的明哥 已提交
1
# 13.4 【项目生成】cookiecutter 的使用
写代码的明哥's avatar
update  
写代码的明哥 已提交
2

写代码的明哥's avatar
update  
写代码的明哥 已提交
3
> 转载自:https://note.qidong.name/2018/10/cookiecutter/
写代码的明哥's avatar
update  
写代码的明哥 已提交
4

写代码的明哥's avatar
update  
写代码的明哥 已提交
5
IDE都会有一套生成新项目的向导(Wizard),通过点点点,就可以得到一个可以运行的某类程序。 这样的程序,具备了推荐的项目结构,配置的基本的编译、打包、测试,尽管功能只是一个`helloworld`。 这个功能,极大地降低了初学者的进入门槛,也统一了某类项目的文件结构,是一个了不起的进步。 最早使用这类手段的,似乎是Visual Studio。
写代码的明哥's avatar
update  
写代码的明哥 已提交
6

写代码的明哥's avatar
update  
写代码的明哥 已提交
7
令人惋惜的是,Python的IDE——PyCharm并不自带这个功能。 这其中,也有Python项目千变万化的因素。 Python的适用范围太广,从桌面到服务器,从游戏到数据分析,都做一套显然投入太大。 而Python又是一门解释型语言,随便写个文件也能直接执行,似乎没有这个必要。
写代码的明哥's avatar
update  
写代码的明哥 已提交
8

写代码的明哥's avatar
update  
写代码的明哥 已提交
9
然而,我要说,还是有必要的!
写代码的明哥's avatar
update  
写代码的明哥 已提交
10

写代码的明哥's avatar
update  
写代码的明哥 已提交
11
因为Python系缺失一个Wizard,也缺少项目结构的标准,于是出现了[cookiecutter](https://github.com/audreyr/cookiecutter)。 这是一个项目生成器,也可称为引擎,因为它只完成了最核心的功能。 真正决定一个项目长什么样的模板,却可以自由定制。 也因此,它能生成任何一种语言的项目。
写代码的明哥's avatar
update  
写代码的明哥 已提交
12

写代码的明哥's avatar
update  
写代码的明哥 已提交
13
## 1. 快速安装
写代码的明哥's avatar
update  
写代码的明哥 已提交
14

写代码的明哥's avatar
update  
写代码的明哥 已提交
15 16 17
```sh
$ pip install cookiecutter
```
写代码的明哥's avatar
update  
写代码的明哥 已提交
18

写代码的明哥's avatar
update  
写代码的明哥 已提交
19
[cookiecutter](https://github.com/audreyr/cookiecutter)就是一个已经发布的Python包,因此用Python的手段可以直接安装。
写代码的明哥's avatar
update  
写代码的明哥 已提交
20

写代码的明哥's avatar
update  
写代码的明哥 已提交
21
对于非Python系的程序员来说,也可以使用包管理器的方式安装。
写代码的明哥's avatar
update  
写代码的明哥 已提交
22

写代码的明哥's avatar
update  
写代码的明哥 已提交
23 24 25 26 27 28
```sh
# For Mac
$ brew install cookiecutter
# For Debian/Ubuntu
$ sudo apt install cookiecutter
```
写代码的明哥's avatar
update  
写代码的明哥 已提交
29

写代码的明哥's avatar
update  
写代码的明哥 已提交
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
## 2. 如何使用

首先,寻找一个合适的[cookiecutter](https://github.com/audreyr/cookiecutter)项目。 最主要的方式,就是访问其GitHub主页的[A Pantry Full of Cookiecutters](https://github.com/audreyr/cookiecutter/tree/db14e06a1dcc0187beeafde72685c3acef93eb68#a-pantry-full-of-cookiecutters)

如果挑选完毕(这里以[cookiecutter-pypackage](https://github.com/audreyr/cookiecutter-pypackage)为例),则可直接执行`cookiecutter`生成项目。

```sh
$ cookiecutter https://github.com/audreyr/cookiecutter-pypackage.git
full_name [Yan QiDong]:
email [yanqd0@outlook.com]:
github_username [yanqd0]:
project_name [Python Boilerplate]: trycookie
project_slug [trycookie]:
project_short_description [Python Boilerplate contains all the boilerplate you need to create a Python package.]: A description
pypi_username [yanqd0]:
version [0.1.0]:
use_pytest [n]:
use_pypi_deployment_with_travis [y]:
add_pyup_badge [n]:
Select command_line_interface:
1 - Click
2 - No command-line interface
Choose from 1, 2 (1, 2) [1]:
create_author_file [y]:
Select open_source_license:
1 - MIT license
2 - BSD license
3 - ISC license
4 - Apache Software License 2.0
5 - GNU General Public License v3
6 - Not open source
Choose from 1, 2, 3, 4, 5, 6 (1, 2, 3, 4, 5, 6) [1]:
写代码的明哥's avatar
update  
写代码的明哥 已提交
62
```
写代码的明哥's avatar
update  
写代码的明哥 已提交
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106

在项目生成过程中,会产生一些提示,需要输入对应信息。 这和各类Wizard的GUI中,填写项目名、包名什么的,是同类操作。 以上是,除了项目名叫`trycookie`,基本都选默认的一个结果。

查看项目结构:

```sh
$ tree -a trycookie
trycookie
├── .editorconfig
├── .github
│   └── ISSUE_TEMPLATE.md
├── .gitignore
├── .travis.yml
├── AUTHORS.rst
├── CONTRIBUTING.rst
├── HISTORY.rst
├── LICENSE
├── MANIFEST.in
├── Makefile
├── README.rst
├── docs
│   ├── Makefile
│   ├── authors.rst
│   ├── conf.py
│   ├── contributing.rst
│   ├── history.rst
│   ├── index.rst
│   ├── installation.rst
│   ├── make.bat
│   ├── readme.rst
│   └── usage.rst
├── requirements_dev.txt
├── setup.cfg
├── setup.py
├── tests
│   ├── __init__.py
│   └── test_trycookie.py
├── tox.ini
└── trycookie
    ├── __init__.py
    ├── cli.py
    └── trycookie.py

4 directories, 30 files
写代码的明哥's avatar
update  
写代码的明哥 已提交
107 108
```

写代码的明哥's avatar
update  
写代码的明哥 已提交
109
如此庞大而复杂的一个项目结构,融合了作者[audreyr](https://github.com/audreyr)对一个开源PyPI项目的理解。 虽然未必适用于任何一个人,但对于什么也不懂的菜鸟来说,却无疑是福音。
写代码的明哥's avatar
update  
写代码的明哥 已提交
110

写代码的明哥's avatar
update  
写代码的明哥 已提交
111
## 3. 基本原理
写代码的明哥's avatar
update  
写代码的明哥 已提交
112

写代码的明哥's avatar
update  
写代码的明哥 已提交
113
[cookiecutter](https://github.com/audreyr/cookiecutter)的工作原理,是先下载一个模板项目,然后替换模板项目的某些内容,生成新的项目。 在以上的示例中,`https://github.com/audreyr/cookiecutter-pypackage.git`就是一个项目的Git链接。 这可以换成任何一个可以用`git clone`来下载的链接,包括各种私有Git托管平台。
写代码的明哥's avatar
update  
写代码的明哥 已提交
114

写代码的明哥's avatar
update  
写代码的明哥 已提交
115
如果是GitHub,还可以用以下的等效形式:
写代码的明哥's avatar
update  
写代码的明哥 已提交
116

写代码的明哥's avatar
update  
写代码的明哥 已提交
117 118 119
```sh
cookiecutter gh:audreyr/cookiecutter-pypackage
```
写代码的明哥's avatar
update  
写代码的明哥 已提交
120

写代码的明哥's avatar
update  
写代码的明哥 已提交
121
[cookiecutter](https://github.com/audreyr/cookiecutter)的简短形式,支持以下三种平台。
写代码的明哥's avatar
update  
写代码的明哥 已提交
122

写代码的明哥's avatar
update  
写代码的明哥 已提交
123 124 125 126 127
| Platform                            | abbreviation |
| ----------------------------------- | ------------ |
| [GitHub](https://github.com/)       | `gh`         |
| [BitBucket](https://bitbucket.org/) | `bb`         |
| [GitLab](https://gitlab.com/)       | `gl`         |
写代码的明哥's avatar
update  
写代码的明哥 已提交
128

写代码的明哥's avatar
update  
写代码的明哥 已提交
129
[cookiecutter](https://github.com/audreyr/cookiecutter)也支持Mercurial(`hg`)。
写代码的明哥's avatar
update  
写代码的明哥 已提交
130

写代码的明哥's avatar
update  
写代码的明哥 已提交
131 132 133
```sh
cookiecutter hg+ssh://hg@bitbucket.org/audreyr/cookiecutter-pypackage
```
写代码的明哥's avatar
update  
写代码的明哥 已提交
134

写代码的明哥's avatar
update  
写代码的明哥 已提交
135
使用过模板的项目,默认都已经被下载到`~/.cookiecutter`目录下。 如果需要再次使用,而又无需更新,可以直接用项目名。
写代码的明哥's avatar
update  
写代码的明哥 已提交
136

写代码的明哥's avatar
update  
写代码的明哥 已提交
137 138 139
```sh
cookiecutter cookiecutter-pypackage
```
写代码的明哥's avatar
update  
写代码的明哥 已提交
140

写代码的明哥's avatar
update  
写代码的明哥 已提交
141
利用这个特点,可以先用各种手段,把模板项目下载到`~/.cookiecutter`目录下,再来使用。
写代码的明哥's avatar
update  
写代码的明哥 已提交
142

写代码的明哥's avatar
update  
写代码的明哥 已提交
143
参考:[Usage — cookiecutter 1.6.0 documentation](https://cookiecutter.readthedocs.io/en/latest/usage.html)
写代码的明哥's avatar
update  
写代码的明哥 已提交
144

写代码的明哥's avatar
update  
写代码的明哥 已提交
145
## 4. 配置文件 
写代码的明哥's avatar
update  
写代码的明哥 已提交
146

写代码的明哥's avatar
update  
写代码的明哥 已提交
147
默认情况下,`~/.cookiecutterrc`就是配置文件。 它实际上是一个YAML文件。 以下是孤的配置文件示例。
写代码的明哥's avatar
update  
写代码的明哥 已提交
148

写代码的明哥's avatar
update  
写代码的明哥 已提交
149 150 151 152 153 154 155 156 157 158 159
```yaml
# vim: set filetype=yaml:

default_context:
  full_name: "Yan QiDong"
  email: "yanqd0@outlook.com"
  github_username: "yanqd0"
cookiecutters_dir: "~/.cookiecutters/"
abbreviations:
    pp: https://github.com/audreyr/cookiecutter-pypackage.git
    gh: https://github.com/{0}.git
写代码的明哥's avatar
update  
写代码的明哥 已提交
160 161
```

写代码的明哥's avatar
update  
写代码的明哥 已提交
162 163 164 165 166 167 168 169 170
可配置项中,`default_context`是设置生成项目时,一些提示信息的默认参数。 `cookiecutters_dir`则是项目的下载位置,一般默认就好。 `abbreviations`是自定义简短形式,属于高级定制功能,仅适用于重度用户。 通常,填一填`default_context`就好。

如果对`~/.cookiecutterrc`这个配置文件的名称和位置不满意, 可以通过环境变量`COOKIECUTTER_CONFIG`, 或者在命令行指定参数`--config-file`来指定新的配置文件。

参考:[User Config (0.7.0+) — cookiecutter 1.6.0 documentation](https://cookiecutter.readthedocs.io/en/latest/advanced/user_config.html)

## 5. 总结一下

[cookiecutter](https://github.com/audreyr/cookiecutter)是一个简单好用的项目生成器引擎,并且已经有很多各种类型的模板。 除了Python项目,还有很多其它语言的项目模板。 它可以极大地省去一个项目初始化的重复劳动,也可以帮助菜鸟程序员成长。
写代码的明哥's avatar
update  
写代码的明哥 已提交
171

写代码的明哥's avatar
update  
写代码的明哥 已提交
172
当然,如果不满意,还是可以自己修改、定制模板的。