如何为类似于NodeJs的python项目设置开发人员环境
背景故事我有一个python项目,它使用setuptools来构建源代码分发。 Pylint集成用于运行测试。我来自一个沉重的NodeJs背景。
问题在对代码进行更改之后,我在分发应用程序之前应该运行几个步骤。
- 运行测试
- 运行pylint
- 清理build / dist目录
- 使用setuptools和distutils构建源代码分发
- 等等
还有其他一些要求,比如
- 使用
pip install -r requirements.txt
安装软件包 - 激活virtualenv
- 触发预提交和预推git挂钩(尚未实现)
在NodeJs项目中,我可以在package.json文件中编写一组带有前后标签的shell命令,以一种非常好的方式完成工作。
目前对于python项目,我使用的是一个shell脚本,它以所需的顺序执行所需的步骤。我想到的另一个选择就是为了处理开发环境而拥有一个package.json。但它听起来并不像pythonic!
如何以优雅的pythonic方式自动执行这些步骤?
回答如下:在对代码进行更改之后,我在分发应用程序之前应该运行几个步骤。
您可以通过将多个命令参数传递给setup.py
脚本来链接多个操作:
$ python setup.py clean test lint sdist build_doc upload
如果工具不提供distutils
命令,您可能需要其他依赖项,例如pylint
没有,因此您需要setuptools-lint
包才能使用python setup.py lint
。
您可以使用与Node项目类似的方式为命令集声明别名。在setup.cfg
旁边创建一个setup.py
文件并添加别名:
# setup.cfg
[aliases]
ci=clean test lint sdist build_doc upload
现在上面的命令与
$ python setup.py ci
至于其他要求,可能Pipenv
是与node
最相似的工具。它具有简洁的功能,如自动创建和激活项目特定的虚拟环境,从Pipfile
安装软件包,锁定依赖项版本(类似于shrinkwrap
命令)等。
Edit
您还可以编写自定义命令并将其绑定在安装脚本中。运行ls
的ls -l
命令示例:
from distutils.core import Command
from setuptools import setup
class Ls(Command):
user_options = []
def initialize_options(self):
pass
def finalize_options(self):
pass
def run(self):
self.spawn(['ls', '-l'])
setup(
name='spam',
version='0.1',
author='nobody',
author_email='[email protected]',
packages=[],
cmdclass={'ls': Ls,},
)
现在运行python setup.py ls
来调用新命令:
$ python setup.py ls
running ls
ls -l
total 8
drwx------ 3 hoefling wheel 96 16 Dez 19:47
com.apple.launchd.1X84ONyuu4
drwx------ 3 hoefling wheel 96 16 Dez 19:47
com.apple.launchd.XbjjBY44Mf
drwxr-xr-x 2 root wheel 64 16 Dez 19:47 powerlog
-rw-r--r-- 1 hoefling wheel 405 16 Dez 19:50 setup.py