在JavaScript项目中,我可以在我的package.json
中指定以下内容:
{
"name": "dredd",
"version": "1.0.4",
"description": "API Blueprint testing tool",
"main": "lib/dredd.js",
"bin": {
"dredd": "bin/dredd"
},
"scripts": {
"lint": "coffeelint ./src",
"pretest": "npm run lint",
"test": "find ./test/ -name '*-test.coffee' | xargs mocha --compilers 'coffee:coffee-script/register' --reporter spec --timeout 120000 --recursive",
...
"coveralls": "./scripts/coveralls.sh",
...
},
"dependencies": {
...
请参阅scripts
部分。我可以定义任何名称和实现的任何“脚本”。然后我可以以npm run <name>
的形式运行它(有些特殊的我甚至可以直接作为npm <name>
运行,例如npm test
)。“script”的实现可以只是一个命令或一行,其工作方式与在shell中的工作方式相同(虽然可移植性是我需要自己实现的东西,npm
对我没有帮助,但没关系)。npm正确地传播任何给定的参数和退出代码。总而言之,我可以:
pre<name>
命令,这些命令将始终在调用<name>
命令之前执行所以它是类似于rake
,make
,grunt
,gulp
等等,但是它是内置的,非常简单,非常容易操作。我在Python项目中错过了类似的东西。我觉得setup.py
是一个文件,它最初是作为Python项目的一个单入口点的,我喜欢这个想法,也愿意接受它。理想情况下,我想要一些类似的东西:
我想要单一入口点,因为我想我的项目是直观的。不应该强迫人们阅读文档或.travis.yml
来运行项目的linter、测试等。他们不需要关心我是使用nosetests
还是{flake8
进行linting。这是实现细节。在
然而,这显然并不容易实现。E、 我希望我的lint
命令内部包含flake8
以及其他内容。然后我希望我的test
命令在运行之前总是运行lint
。在
我见过一些实现自定义命令的方法,即子类化Command
,并在setup.py
中的setup(...)
中声明这样的命令,但我没有找到好的官方文档。而且,很多文章都很旧,很难理解2016年的现状和当前的最佳实践,因为历史上有多个项目在处理打包(distutils
,setuptools
,pip
,easy_install
,…)。即使我能够实现类并调用它并在python setup.py --help
上列出命令,我仍然必须自己实现子进程部分、退出代码、stdin、stderr和参数重定向。这对我的场景来说太复杂了,我想让我的项目保持简单并专注于它自己的目的。在
测试框架通常实现一些重量级的自定义命令,这些命令可以设置为python setup.py test
的替代。实现在数百行上,如果我想在命令中添加一些东西(例如,如果我想在每次调用python setup.py test
时flake8 && pytest tests
),那似乎很难实现。在
我认为很多人很难接受他们的命令:
# setup.py
if sys.argv[0] == 'test':
# do something
if sys.argv[0] == 'publish':
# do something
setup(...
这很简单,但是它没有集成到现有的setup.py
基础设施中,如果我只想调用一个shell命令,我仍然需要自己实现所有的子进程。另外,我不确定是否可以轻松地调用原始命令(例如,我想用某种东西包装python setup.py test
),所以我将写下if sys.argv[0] == 'test':
块并执行一些自定义操作,但是我如何在以后继续测试呢?同样,找不到与此相关的文档。在
上面的两个选项都不容易编写或维护。然而,我不相信在Python生态系统中没有什么能像我所寻找的那样。我想我一定错过了什么。有人能至少给我指出正确的方向吗?至少用setuptools
和distutils
向我解释一下情况,在哪里可以找到所有相关的文档?在
超简单的基本方法。但是需要在系统上安装
flake8
。在相关问题 更多 >
编程相关推荐