El blog de cubells

Cookiecutters

Quan crees un projecte amb Django, el framework et crea un estructura de fitxers molt determinada. Veiem-ho creant-ne un ràpidament:

(test) cubells@portatil:/tmp/test$ django-admin startproject hola
(test) cubells@portatil:/tmp/test$ tree hola
hola
├── hola
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

Però moltes vegades aquesta estructura no és la millor per al nostre projecte, per exemple, quan fem servir control de versions.

Aleshores tenim els cookiecutters, els quals ens ajuden a crear una estructura del projecte un poc millor per a determinades tasques, o simplemente amb una estructura més clara amb la qual ens trobem més còmodes. Solament executem una comanda des de la finestra de comandaments i, amb un assistent amb preguntes que anem responent, ens creen tot l'esquelet que necessitem per començar a treballar.

Per exemple, podem crear un projecte amb un dels cookiecutters que més m'agraden:

$ cookiecutter https://github.com/pydanny/cookiecutter-django
project_name [My Awesome Project]: Proves
project_slug [proves]: 
description [Behold My Awesome Project!]: 
author_name [Daniel Roy Greenfeld]: cubells
email [cubells@example.com]: vicent@vcubells.net
domain_name [example.com]: cubells.io
version [0.1.0]: 
Select open_source_license:
1 - MIT
2 - BSD
3 - GPLv3
4 - Apache Software License 2.0
5 - Not open source
Choose from 1, 2, 3, 4, 5 [1]: 3
timezone [UTC]: 
windows [n]: 
use_pycharm [n]: y
use_docker [n]: 
Select postgresql_version:
1 - 10.3
2 - 10.2
3 - 10.1
4 - 9.6
5 - 9.5
6 - 9.4
7 - 9.3
Choose from 1, 2, 3, 4, 5, 6, 7 [1]: 5
Select js_task_runner:
1 - None
2 - Gulp
3 - Grunt
Choose from 1, 2, 3 [1]: 1
custom_bootstrap_compilation [n]: 
use_compressor [n]: 
use_celery [n]: 
use_mailhog [n]: 
use_sentry_for_error_reporting [y]: 
use_opbeat [n]: 
use_whitenoise [y]: 
use_heroku [n]: 
use_travisci [n]: 
keep_local_envs_in_vcs [y]: 
[SUCCESS]: Project initialized, keep up the good work!

I el resultat és una estructura com aquesta:

$ tree proves
proves
├── config
│   ├── __init__.py
│   ├── settings
│   │   ├── base.py
│   │   ├── __init__.py
│   │   ├── local.py
│   │   ├── production.py
│   │   └── test.py
│   ├── urls.py
│   └── wsgi.py
├── CONTRIBUTORS.txt
├── COPYING
├── docs
│   ├── conf.py
│   ├── deploy.rst
│   ├── docker_ec2.rst
│   ├── index.rst
│   ├── __init__.py
│   ├── install.rst
│   ├── make.bat
│   ├── Makefile
│   └── pycharm
│       ├── configuration.rst
│       └── images
│           ├── 1.png
│           ├── 2.png
│           ├── 3.png
│           ├── 4.png
│           ├── 7.png
│           ├── 8.png
│           ├── f1.png
│           ├── f2.png
│           ├── f3.png
│           ├── f4.png
│           ├── issue1.png
│           └── issue2.png
├── LICENSE
├── locale
│   └── README.rst
├── manage.py
├── proves
│   ├── contrib
│   │   ├── __init__.py
│   │   └── sites
│   │       ├── __init__.py
│   │       └── migrations
│   │           ├── 0001_initial.py
│   │           ├── 0002_alter_domain_unique.py
│   │           ├── 0003_set_site_domain_and_name.py
│   │           └── __init__.py
│   ├── __init__.py
│   ├── static
│   │   ├── css
│   │   │   └── project.css
│   │   ├── fonts
│   │   ├── images
│   │   │   └── favicon.ico
│   │   ├── js
│   │   │   └── project.js
│   │   └── sass
│   │       ├── custom_bootstrap_vars.scss
│   │       └── project.scss
│   ├── templates
│   │   ├── 403_csrf.html
│   │   ├── 404.html
│   │   ├── 500.html
│   │   ├── account
│   │   │   ├── account_inactive.html
│   │   │   ├── base.html
│   │   │   ├── email_confirm.html
│   │   │   ├── email.html
│   │   │   ├── login.html
│   │   │   ├── logout.html
│   │   │   ├── password_change.html
│   │   │   ├── password_reset_done.html
│   │   │   ├── password_reset_from_key_done.html
│   │   │   ├── password_reset_from_key.html
│   │   │   ├── password_reset.html
│   │   │   ├── password_set.html
│   │   │   ├── signup_closed.html
│   │   │   ├── signup.html
│   │   │   ├── verification_sent.html
│   │   │   └── verified_email_required.html
│   │   ├── base.html
│   │   ├── pages
│   │   │   ├── about.html
│   │   │   └── home.html
│   │   └── users
│   │       ├── user_detail.html
│   │       ├── user_form.html
│   │       └── user_list.html
│   └── users
│       ├── adapters.py
│       ├── admin.py
│       ├── apps.py
│       ├── __init__.py
│       ├── migrations
│       │   ├── 0001_initial.py
│       │   └── __init__.py
│       ├── models.py
│       ├── tests
│       │   ├── factories.py
│       │   ├── __init__.py
│       │   ├── test_admin.py
│       │   ├── test_models.py
│       │   ├── test_urls.py
│       │   └── test_views.py
│       ├── urls.py
│       └── views.py
├── pytest.ini
├── README.rst
├── requirements
│   ├── base.txt
│   ├── local.txt
│   └── production.txt
├── setup.cfg
└── utility
    ├── install_os_dependencies.sh
    ├── install_python_dependencies.sh
    ├── requirements-jessie.apt
    ├── requirements-stretch.apt
    ├── requirements-trusty.apt
    └── requirements-xenial.apt

uau!! Ben senzill, com podeu vore.

Tot això vos ho compte perquè he descobert una web molt interessant on pots tindre a mà un munt de cookiecutters, tant per a python com per a Django: un generador de plantilles amb cookiecutters.

Simplement heu de respondre via web les preguntes de l'assistent que hem vist, i en prémer el botó "genera", et descargues un fitxer comprimit amb l'estructura del projecte. És clar que a mi sempre m'agrada més la finestra de comandaments que les interfícies, però per a determinada gent els pot agradar la web. Podeu utilitzar-la per fer proves simplement.

Teniu informació dels distints projectes de cookiecutters en aquesta pàgina, amb informació important sobre el seu desenvolupament, perquè trieu el millor que s'adapta al vostre projecte.

M'ha paregut interessant i l'afegisc a l'apartat d'enllaços.

Sense comentaris encara. Comenta ara